Spring aop多个切入点和建议但只有最后一个有效

Jar*_*sen 10 java aop spring

我创建了两个完全独立的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>
Run Code Online (Sandbox Code Playgroud)

问题是只有最后一个切入点有效(如果我改变顺序,pointcutOne因为它是最后一个).我已经通过创建一个大切入点来实现它,但我想将它们分开.有什么建议,为什么一次只有一个切入点工作?

Esp*_*pen 6

尝试在<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>
Run Code Online (Sandbox Code Playgroud)

我猜你的XML配置只产生一个代理对象,而它应该是两个代理对象.


顺便说一句:您应该考虑使用@AspectJ语法.它只是带有注释中的切入点和建议的Java.它适用于Spring AOP,并提供比XML替代方案更多的功能.

您只需在配置中@AspectJ使用Spring AOP 启用方面:

<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"/>
Run Code Online (Sandbox Code Playgroud)

Aspect可能是这样的:

@Aspect
public class Aspect1 {

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

    @Around("demoPointcut()")
    public void demoAdvice(JoinPoint joinPoint) {}
}
Run Code Online (Sandbox Code Playgroud)

更新:

使用切入点组合其他三个切入点的示例:

@Pointcut("traceMethodsInDemoPackage() && notInTestClass() " +
    "&& notSetMethodsInTraceDemoPackage()")
public void filteredTraceMethodsInDemoPackage() {}
Run Code Online (Sandbox Code Playgroud)