2010-05-04 7 views
9

Ich habe zwei Spring AOP Pointcuts erstellt, die komplett getrennt sind und für verschiedene Teile des Systems eingewebt werden. Die Pointcuts werden in zwei verschiedenen Around-Advices verwendet, diese Around-Advices zeigen auf dieselbe Java-Methode.Spring aop mehrere Pointcuts & Beratung, aber nur die letzte funktioniert

Wie die XML-Datei aussieht:

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

Das Problem ist, dass nur die letzten pointcut Werke (wenn ich die Reihenfolge pointcutOne Werke ändern, weil es der letzte ist). Ich habe es geschafft, indem ich einen großen Pointcut erstellt habe, aber ich möchte sie getrennt haben. Irgendwelche Vorschläge, warum nur jeweils einer der Punktabschnitte funktioniert?

+0

Ich denke, "AOP: AROUNG" ist nur ein Tippfehler in der Frage. – Bozho

+0

ja, tut mir leid. –

Antwort

6

Versuchen Sie, den Pointcut und den Ratschlag innerhalb des Elements <aop:aspect> zu haben. Etwas wie folgt aus:

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

Ich denke, Ihre XML-Konfiguration in nur einem Proxy-Objekt geführt, während es zwei Proxy-Objekte hätte sein sollen.


Btw: Sie sollten stattdessen mit @AspectJ Syntax prüfen. Es ist nur Java mit Pointcuts und Ratschlägen in Annotationen. Es funktioniert gut mit Spring AOP und bietet mehr Funktionalität als die XML-Alternative.

Alles, was Sie in Ihrer Konfiguration benötigen @AspectJ Aspekte mit Frühling AOP zu aktivieren:

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

Und die Aspect so etwas wie dies sein könnte:

@Aspect 
public class Aspect1 { 

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

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

Aktualisiert:

Beispiel das verwendet einen Pointcut, um drei andere Pointcuts zu kombinieren:

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

Das gleiche Problem, das ist sehr seltsam. Es funktioniert gut, wenn ich nur einen Punktschnitt habe, aber es wird schnell sehr groß. Danke für die Vorschläge zur Verwendung von Anmerkungen. Ich stimme dir vollkommen zu, dass es eine bessere Lösung ist als die Verwendung von XML. Ich habe ähnliche Pointcuts als Annotationen zusätzlich zur XML, aber ich wollte auch XML unterstützen, weil es dem Hauptprojekt ermöglicht, die Aspekte zu ändern, ohne es neu zu kompilieren. –

+0

Das ist seltsam. Die Proxy-Objekte sollten rekursiv vor und nach der von Ihrem Joinpoint empfohlenen Methode aufgerufen worden sein. Wenn es mit einem Pointcut funktioniert, können Sie einen dritten Pointcut erstellen, der die ersten beiden kombiniert und in der around-Anweisung verwendet. – Espen

+0

Die Verwendung der Annotationen funktioniert großartig, also denke ich, Ill aktualisieren zumindest die meisten Aspekte, um dies anstelle von XML zu verwenden. Bitte beachten Sie, dass wir uns neu kompilieren müssen, um Änderungen vorzunehmen. Danke für die Hilfe! –

Verwandte Themen