2010-07-28 8 views
2

저는 프로젝트에서 Spring AOP를 시작하고 Spring AOP가 제대로 작동하는 데 몇 가지 문제가 있습니다.Spring AOP - 트리거하지 않는 Pointcut

나는 AOP를 통해 프로파일 링하고자하는 TransportImpl과 SesssionImpl의 두 객체가 있습니다. 두 객체 (빈)는 Spring을 통해 초기화됩니다. 두 콩은 모두 비즈니스 용 인터페이스 (전송 및 세션)의 구현입니다. Aspects를 TransportImpl 빈에 적용하면 제대로 작동하지만 SessionImpl에 적용된 Aspects는 실행되지 않습니다. "mySessionMonitor"Aspect가 Spring에 의해 초기화되고 SessionImpl 객체가 예외 나 오류없이 초기화된다는 것을 확인할 수 있습니다.

가능한 가장 기본적인 형식으로 PointCuts 및 Aspect를 제거했습니다. SessionImpl Bean이 초기화되고 init-method initialise가 호출 될 때 PointCut sessionOperation이 아래에 설명 된대로 이 발생합니다. 그러나 이것은 결코 일어나지 않습니다. 여기서 무엇이 잘못 될 수 있습니까? 구성 파일에서

:

<bean id="MyTransport" class="my.app.transport.TransportImpl" scope="singleton" />     
<bean id="MySession" class="my.app.session.SessionImpl" init-method="initialise" scope="singleton" /> 

<aop:aspectj-autoproxy proxy-target-class="true"> 
    <aop:include name="myTransportMonitor" /> 
    <aop:include name="mySessionMonitor" /> 
</aop:aspectj-autoproxy> 

<bean id="myTransportMonitor" class="my.app.aspects.TransportMonitoringAspect"/> 
<bean id="mySessionMonitor" class="my.app.aspects.SessionMonitoringAspect" /> 

화면 코드

// Aspect monitoring code 
@Aspect 
public class SessionMonitoringAspect 
{ 
    private Logger fileLogger = Logger.getLogger("myLogger"); 

    public void initialise() 
    { 
     fileLogger.info("Initialising SessionMonitoringAspect"); 
    } 

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

    @Pointcut ("within(my.app.session..*)") 
    private void inSession(){} 

    @Pointcut("anyPublicOperation() && inSession()") 
    private void sessionOperation(){} 

    @Before("sessionOperation()") 
    public void sessionOperationDetected(JoinPoint jp) 
    { 
     fileLogger.info("Session operation detected - signature: " + jp.getSignature()); 
    } 
} 

답변

3

저는 개인적으로 응용 프로그램 컨텍스트에 Aspect 포인트 컷 구성을 넣는 것을 선호하며, aop : aspect에서 ref가 누락되었습니다.

<bean id="mySessionMonitor" class="my.app.aspects.SessionMonitoringAspect" /> 

<aop:config proxy-target-class="true"> 
    <aop:aspect ref="mySessionMonitor"> 
    <aop:pointcut id="around" expression="execution (public * *(..))"/></aop:pointcut> 
    <aop:around pointcut-ref="around" method="aroundAdvice"/> 
    </aop:aspect> 
</aop:config> 
+0

@ Brain : ........이 두 줄을 설명해 주시겠습니까? ... Act 나는 비슷한 문제가 내 경우에 코드를 사용하고 싶습니다 ...하지만 위의 것을 이해할 수 없습니다. 두 줄 ...... 감사합니다 ... – aProgrammer

+0

aop : pointcut 속성은 advice가 interceed 할 곳의 표현식을 지정합니다. id는 사용자가 지정한 이름으로 aop : around 행에서 사용되며 @Aspect에서 실행해야하는 메서드를 정의합니다. – ndtreviv

0

내가 initialise() 방법은 my.app.session.SessionImpl의 일부가 아닙니다 바랍니다. 그렇다면 initialise() 귀하의 Aspect에 대한 방법은 실행되지 않습니다. Bean 클래스에서 aspect의 메소드를 호출 할 수 없기 때문이다. 그렇지 않으면 세부 이해를 위해 my.app.session.SessionImpl 코드를 첨부하십시오.

0

주석 기반 구성을 선호하는 경우, this example을 작성하십시오. XML 구성에 필요한 것은 <aop:aspectj-autoproxy />입니다.

관련 문제