2010-05-04 21 views
9

Stworzyłem dwa punktowe skróty AOP, które są całkowicie oddzielne i będą wplecione dla różnych części systemu. Punkty są używane w dwóch różnych wokół porad, te około-porady będą wskazywać na tę samą metodę Java.Spring aop wiele wskazówek i porad, ale tylko ostatni działa

Jak plik xml wygląda:

<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> 

Problem polega na tym, że tylko w ubiegłym pointcut dzieła (gdybym zmienić kolejność pointcutOne działa, ponieważ jest to ostatni jeden). Zrobiłem to, tworząc jeden wielki punkt, ale chciałbym je rozdzielić. Jakieś sugestie, dlaczego działa tylko jeden z punktów na raz?

+0

Zgaduję, że "aop: aroung" jest literówką tylko w pytaniu. – Bozho

+0

tak, przepraszam za to. –

Odpowiedz

6

Spróbuj uzyskać wskazówkę i poradę wewnątrz elementu <aop:aspect>. Coś takiego:

<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> 

Domyślam się, że twoja konfiguracja XML zaowocowała tylko jednym obiektem proxy, a powinny to być dwa obiekty proxy.


Btw: Zamiast tego należy rozważyć użycie składni @AspectJ. To tylko Java z punktami i poradami w adnotacjach. Działa dobrze ze Spring AOP i oferuje więcej funkcjonalności niż alternatywa XML.

Wszystko czego potrzebujesz w danej konfiguracji, aby umożliwić @AspectJ aspekty z wiosny 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"/> 

oraz aspekt może być coś takiego:

@Aspect 
public class Aspect1 { 

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

    @Around("demoPointcut()") 
    public void demoAdvice(JoinPoint joinPoint) {} 
} 

Aktualizacja:

Przykład używający cięcia punktowego do łączenia trzech innych punktów:

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

Ten sam problem, to bardzo dziwne. To działa dobrze, gdy mam tylko jeden punkt, ale szybko staje się bardzo duży. Dziękujemy za sugestie dotyczące korzystania z adnotacji. Całkowicie zgadzam się z tobą, że jest to lepsze rozwiązanie niż użycie xml. Podobny charakter mają także adnotacje oprócz xml, ale chciałem także wspierać xml, ponieważ pozwoli to głównemu projektowi na zmianę aspektów bez rekompilacji. –

+0

To dziwne. Obiekty proxy powinny były zostać wywołane rekursywnie przed i po metodzie zalecanej przez twój joinpoint. Jeśli działa z jednym cięciem punktowym, można utworzyć trzeci punkt cięcia, który łączy dwa pierwsze i używa go w pobliżu porady. – Espen

+0

Korzystanie z adnotacji działa świetnie, więc myślę, że zaktualizuję przynajmniej większość aspektów, aby użyć tego zamiast xml. Musimy tylko pamiętać, że musimy dokonać rekompilacji, aby wprowadzić zmiany. Dzięki za pomoc! –

Powiązane problemy