我创建了两个完全独立的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
有效,因为它是最后一个)。我已经通过创建一个大切入点来实现它,但我想将它们分开。有什么建议,为什么一次只有一个切入点工作?
答案 0 :(得分: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>
我猜你的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() {}