Я создал два Spring AOP pointcuts, которые являются абсолютно отдельными и будут сотканы в для различных частей системы. pointcuts используются в двух различных вокруг советов, они вокруг советов укажут на тот же метод 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>
Проблема состоит в том, что только последние работы pointcut (если я изменяю порядок pointcutOne
работы, потому что это - последнее). Я заставил это работать путем создания одного большого pointcut, но я хотел бы сделать, чтобы они отделились. Какие-либо предложения к тому, почему только один из pointcuts работает за один раз?
Попробуйте использовать pointcut и advice внутри элемента
. Примерно так:
<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.
Все, что вам нужно в вашей конфигурации, чтобы включить аспекты @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"/>
Аспект может быть примерно таким:
@Aspect
public class Aspect1 {
@Pointcut("execution(* *(..))")
public void demoPointcut() {}
@Around("demoPointcut()")
public void demoAdvice(JoinPoint joinPoint) {}
}
Обновлено:
Пример, который использует pointcut для объединить три других pointcut:
@Pointcut("traceMethodsInDemoPackage() && notInTestClass() " +
"&& notSetMethodsInTraceDemoPackage()")
public void filteredTraceMethodsInDemoPackage() {}