2010-05-04 5 views
9

Я создал два точечных точки Spring AOP, которые полностью раздельны и будут сотканы для разных частей системы. Точечные ссылки используются в двух разных советах, эти советы касаются одного и того же метода Java.Весна aop несколько pointcuts & совет, но только последний работает

Как файл 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, но я хотел бы, чтобы они были разделены. Любые предложения о том, почему работает только один из pointcut?

+0

Я думаю, что 'aop: aroung' является опечаткой только в вопросе. – Bozho

+0

да, извините за то. –

ответ

6

Постарайтесь иметь pointcut и совет внутри элемента <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 привела только один прокси-объект, в то время как оно должно было быть два прокси-объекты.


Btw: Вы должны рассмотреть возможность использования @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 для объединения трех других pointcuts:

@Pointcut("traceMethodsInDemoPackage() && notInTestClass() " + 
    "&& notSetMethodsInTraceDemoPackage()") 
public void filteredTraceMethodsInDemoPackage() {} 
+0

Такая же проблема, это очень странно. Он отлично работает, когда у меня есть только один pointcut, но он быстро становится очень большим. Спасибо за предложения об использовании аннотаций. Я полностью согласен с вами в том, что это лучшее решение, чем использование xml. У меня есть аналогичные pointcut как аннотации в дополнение к xml, но я также хотел бы поддержать xml, потому что это позволит главному проекту изменить аспекты без перекомпиляции. –

+0

Это странно. Объекты прокси должны были быть вызваны рекурсивно до и после метода, рекомендованного вашей точкой соединения. Если он работает с одним pointcut, вы можете создать третий pointcut, который объединяет первые два и использовать это в советах. – Espen

+0

Использование аннотаций отлично работает, поэтому я думаю, что я обновляю по крайней мере большинство аспектов, чтобы использовать это вместо xml. Просто имейте в виду, что нам нужно перекомпилировать, чтобы вносить изменения. Спасибо за помощь! –

Смежные вопросы