Spring aop несколько pointcuts и совет, но только последний работает

Я создал два 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 работает за один раз?

10
задан Clijsters 19 January 2018 в 16:59
поделиться

1 ответ

Попробуйте использовать 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() {}
6
ответ дан 4 December 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: