【问题标题】:Spring AOP - Pointcuts not triggeringSpring AOP - 切入点未触发
【发布时间】:2010-07-28 12:23:30
【问题描述】:

我刚刚开始在我的项目中使用 Spring AOP,但在让 Spring AOP 正常工作方面遇到了一些问题。

我有两个对象,TransportImpl 和 SesssionImpl,我想通过 AOP 进行分析。两个对象(bean)都是通过 Spring 初始化的。两个bean都是业务的实现 接口(传输和会话)。我可以让应用到 TransportImpl bean 的 Aspects 正常工作,但应用到 SessionImpl 的 Aspects 不会触发。我可以确认 "mySessionMonitor" Aspect 由 Spring 初始化,并且 SessionImpl 对象也被初始化,没有任何异常或错误。

我已将 PointCuts 和 Aspect 简化为可能的最基本形式。我本来期望下面描述的 PointCut sessionOperation 在初始化 SessionImpl bean 并调用 init 方法初始化时触发。但这永远不会发生。这里可能出了什么问题?

来自配置文件:

<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());
    }
}

【问题讨论】:

    标签: java spring spring-aop


    【解决方案1】:

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

    【讨论】:

    • @ Brain : ........你能解释一下这两行......我也有类似的问题想在我的情况下使用你的代码......但是看不懂上面两行……谢谢哥们……
    • aop:pointcut 属性指定了通知应该在哪里进行调解的表达式。 id 是您给它的名称,然后在 aop:around 行中使用它,并定义它应该在 @Aspect 中运行的方法。
    【解决方案2】:

    如果您更喜欢基于注释的配置,请参阅我写的this example。您在 XML 配置中只需要&lt;aop:aspectj-autoproxy /&gt;

    【讨论】:

      【解决方案3】:

      我希望initialise() 方法不是my.app.session.SessionImpl 的一部分。如果是这样,您的 Aspect 的 initialise() 方法将不会触发。因为你不能从 bean 类调用方面的方法。否则请附上my.app.session.SessionImpl代码详细了解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多