我创建了两个完全独立的Spring AOP切入点,并将它们编织到系统的不同部分。这些切入点在两个不同的围绕建议中使用,这些围绕建议将指向相同的Java方法。

xml文件的外观:

<aop:config>
    <aop:pointcut expression="execution(......)" id="pointcutOne" />
    <aop:pointcut expression="execution(.....)" id="pointcurTwo" />

    <aop:aspect id="..." ref="springBean">
        <aop:around pointcut-ref="pointcutOne" method="commonMethod" />
        <aop:around pointcut-ref="pointcutTwo" method="commonMethod" />
    </aop:aspect>
</aop:config>

问题在于只有最后一个切入点有效(如果我更改了pointcutOne的顺序,因为它是最后一个切入点)。我已经通过创建一个大切入点使它起作用,但是我想将它们分开。关于为什么一次只切入一个切入点的任何建议?

最佳答案

尝试在<aop:aspect>元素内包含切入点和建议。像这样的东西:

<aop:config>
  <aop:aspect id="aspect1" ref="springBean">
    <aop:pointcut expression="execution(......)" id="pointcutOne" />
    <aop:around pointcut-ref="pointcutOne" method="commonMethod" />
  </aop:aspect>

  <aop:aspect id="aspect2" ref="springBean">
    <aop:pointcut expression="execution(.....)" id="pointcurTwo" />
    <aop:around pointcut-ref="pointcutTwo" method="commonMethod" />
  </aop:aspect>
</aop:config>

我猜您的XML配置只产生了一个代理对象,而它本来应该是两个代理对象。

顺便说一句:您应该考虑改用 @AspectJ 语法。它只是Java,在注释中带有切入点和建议。它与Spring AOP配合良好,并提供了比XML替代方案更多的功能。

您需要在配置中使用Spring AOP启用 @AspectJ 方面的所有内容:
<aop:aspectj-autoproxy>
     <aop:include name="aspect1" />
     <aop:include name="aspect2" />
</aop:aspectj-autoproxy>

<bean id="aspect1" class="com.demo.Aspect1"/>
<bean id="aspect2" class="com.demo.Aspect2"/>

而Aspect可能是这样的:
@Aspect
public class Aspect1 {

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

    @Around("demoPointcut()")
    public void demoAdvice(JoinPoint joinPoint) {}
}

更新:

使用切入点组合三个其他切入点的示例:
@Pointcut("traceMethodsInDemoPackage() && notInTestClass() " +
    "&& notSetMethodsInTraceDemoPackage()")
public void filteredTraceMethodsInDemoPackage() {}

08-29 00:14