복붙노트

[SPRING] 다른 JAR에서 정의 된 경우 Spring Aspect가 실행되지 않는다.

SPRING

다른 JAR에서 정의 된 경우 Spring Aspect가 실행되지 않는다.

나는 Spring 프로젝트와 applicationContext.xml이 각각있는 두 개의 하위 프로젝트로 구성된 프로젝트를 가지고있다.

하나는 프레임 워크 프로젝트 (JAR로 끝남)이고 하나는 실제 응용 프로그램 (WAR로 끝나고 JAR에 종속되고 JAR의 applicationContext.xml을 자체 applicationContext.xml로 가져옴)입니다.

프레임 워크 프로젝트에서 모든 공개 메소드 측면을 정의했습니다.

@Aspect
@Configurable
public class MyAspect {

    @Autowired
    private SomeBean mBean;

    @Pointcut("execution(public * *(..))")
    public void anyPublicMethod() {
    }

    @Before("anyPublicMethod()")
    public void checkAuthorization(JoinPoint pJoinPoint) {
        mBean.doSomething();
    }
}

그리고 프레임 워크의 applicationContext.xml (실제 응용 프로그램 프로젝트의 applicationContext.xml에서 가져옴)에서 AOP를 활성화했습니다.

...
    <context:spring-configured />

    <context:component-scan base-package="com.mypackage" />

    <aop:aspectj-autoproxy/>
...

프레임 워크 프로젝트에서 테스트 할 때 스프링 bean에서 public 메소드를 호출 할 때 aspect가 예상대로 실행됩니다.

위에서 언급했듯이 프레임 워크 프로젝트는 종속성으로 애플리케이션 프로젝트에 포함되어 있지만 Spring Bean의 응용 프로그램 프로젝트에서 일치하는 메소드 (공개)를 호출 할 때 aspect가 실행되지 않습니다.

나는 또한 aspect의 XML 설정을 사용해 보았다. 그것은 같은 행동으로 이어집니다.

해결법

  1. ==============================

    1.IMHO, 접근 방식을 약간 조정할 수 있습니다.

    IMHO, 접근 방식을 약간 조정할 수 있습니다.

    제일 먼저 할 일은 war의 응용 프로그램 컨텍스트 구성을 web.xml에 위임하는 것입니다.

    <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>WEB-INF/classes/spring*.xml</param-value>
    </context-param>
    

    둘째로, war 파일의 응용 프로그램 컨텍스트를 사용할 수 있기 때문에이 응용 프로그램 컨텍스트를 사용할 수 있습니다. 웹 프로젝트에서 얻을 수있는 구성을 사용하여 응용 프로그램 컨텍스트를 가져 오는 것과 같은 순간이 들리 겠지만 이는 잘못된 것입니다.

    마지막으로 나는 이들이 런타임이고 컴파일 된 측면이 아니라는 가정을하고 있습니다. 후자의 경우 의존성에 관계없이 war 프로젝트에서 aspectj로 다시 컴파일해야합니다.

  2. ==============================

    2.스프링 MVC 웹 애플리케이션에서는 실제로 루트 컨텍스트와 서블릿 컨텍스트라는 두 가지 컨텍스트가 있습니다. 서블릿의 컨텍스트에서 aspect를 설정해야한다. 실제로, 서블릿의 컨텍스트는 루트를 "본다".

    스프링 MVC 웹 애플리케이션에서는 실제로 루트 컨텍스트와 서블릿 컨텍스트라는 두 가지 컨텍스트가 있습니다. 서블릿의 컨텍스트에서 aspect를 설정해야한다. 실제로, 서블릿의 컨텍스트는 루트를 "본다".

    그래서 여러분의 aspect를 빈에 적용하기를 원한다면 프레임 워크 설정을 다른 설정이 아닌 [servlet-name] -servlet.xml 파일에서 가져와야한다.

  3. ==============================

    3.그게 내가하는 일이야:

    그게 내가하는 일이야:

    <context:annotation-config/>
    <context:component-scan base-package="my.pkg" scoped-proxy="interfaces"/> 
    <aop:aspectj-autoproxy proxy-target-class="true" />
    

    나는 그것이 당신의 경우에 효과가 있는지 말할 수는 없지만 ... github에서 프로젝트의 버려진 버전을 설정하면 도움이 될 것입니다.

    이것은 jvm을 짜거나 인스트루먼트하는 바이트 코드를 필요로하지 않습니다. 문제의 메서드를 호출 할 때 자동 삽입 된 특성을 사용하는지 확인하십시오.

    @Autowired
    private MyType myTypeInstance; // MyType is usually an interface
    
    public void someMethod() {
        // myTypeInstance is actually a proxy object... thereby providing the
        // access point for the weaving stuff. (as far as I understand it)
        myTypeInstance.method();
    }
    

    그렇지 않으면 스프링 관리 AOP 클래스 프록시가 마음에 들지 않으면 다음 지시 사항을 따르십시오.

  4. ==============================

    4.나는 당신이 스프링으로 인식되도록하기 위해 당신의 구성 요소를 구성해야한다고 생각합니다.

    나는 당신이 스프링으로 인식되도록하기 위해 당신의 구성 요소를 구성해야한다고 생각합니다.

    http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop-at-aspectj

  5. from https://stackoverflow.com/questions/10204374/spring-aspect-not-executed-when-defined-in-other-jar by cc-by-sa and MIT license