首页 文章

Spring AOP - 切入点不会触发

提问于
浏览
2

我刚刚在我的项目中开始使用Spring AOP,并且在使Spring AOP正常工作时遇到了一些问题 .

我有两个对象,TransportImpl和SesssionImpl,我想通过AOP进行分析 . 两个对象(bean)都是通过Spring初始化的 . 两个bean都是业务接口(传输和会话)的实现 . 我可以将Aspects应用于TransportImpl bean以便正常工作,但是应用于SessionImpl的那些不会触发 . 我可以确认“mySessionMonitor”方面是由Spring初始化的,并且SessionImpl对象也是在没有任何异常或错误的情况下初始化的 .

我已经将我的PointCuts和Aspect剥离到最基本的形式 . 我希望在初始化SessionImpl bean并调用init-method初始化时触发下面描述的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 回答

  • 0

    我个人更喜欢将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>
    
  • 3

    如果您更喜欢基于注释的配置,请参阅this example我写道 . 您在XML配置中所需要的只是 <aop:aspectj-autoproxy /> .

  • 0

    我希望 initialise() 方法不是 my.app.session.SessionImpl 的一部分 . 如果这样 initialise() 方法你的看点不会开火 . 因为你不能从bean类调用aspect的方法 . 否则请附上 my.app.session.SessionImpl 代码以了解详细信息 .

相关问题