2012-04-18 7 views
5

Ich habe ein Projekt, bestehend aus zwei Teilprojekten, die beide Spring-Projekte sind und jeweils eine applicationContext.xml.Spring Aspekt nicht ausgeführt, wenn in anderen JAR definiert

Eines ist ein Framework-Projekt (das als JAR endet) und eines ist die eigentliche Anwendung (die als WAR endet und vom JAR abhängt und die applicationContext.xml der JAR in ihre eigene applicationContext.xml importiert).

Im Framework-Projekt habe ich einen Aspekt für alle öffentlichen Methoden definiert.

@Aspect 
@Configurable 
public class MyAspect { 

    @Autowired 
    private SomeBean mBean; 

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

    @Before("anyPublicMethod()") 
    public void checkAuthorization(JoinPoint pJoinPoint) { 
     mBean.doSomething(); 
    } 
} 

Und ich habe in der applicationContext.xml des Rahmens AOP aktiviert (die durch die applicationContext.xml des eigentlichen Anwendungsprojekt importiert wird).

Beim Testen im Framework-Projekt wird der Aspekt wie erwartet ausgeführt, wenn öffentliche Methoden für Spring-Beans aufgerufen werden.

Wie oben erwähnt, wird das Framework-Projekt als Abhängigkeit in das Anwendungsprojekt aufgenommen, aber der Aspekt wird nicht ausgeführt, wenn im Anwendungsprojekt auf Spring-Beans passende Methoden (beliebige öffentliche) aufgerufen werden.

Ich habe auch versucht, XML-Konfiguration des Aspekts zu verwenden. Das führt zu demselben Verhalten.

Antwort

4

IMHO, können Sie den Ansatz etwas zwicken.

Das erste, was ich tun würde, ist Konfiguration des Anwendungskontextes an die web.xml für den Krieg zu delegieren:

<context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>WEB-INF/classes/spring*.xml</param-value> 
</context-param> 

Zweitens würde ich AOP in Sie Krieg-Datei der Anwendung Kontext ermöglichen, wie das ist, wo du willst es benutzen. Im Moment klingt es so, als würden Sie den Anwendungskontext mit AOP-Konfiguration importieren, nur um es in Ihr Webprojekt zu bekommen, was vielleicht falsch ist.

Schließlich mache ich die Annahme, dass dies Laufzeit und nicht kompilierte Aspekte sind, in letzterem Fall müssten Sie mit aspectj in Ihrem Kriegsprojekt unabhängig von der Abhängigkeit neu kompilieren.

+0

Durch Aktivieren von AOP im Anwendungskontext wurde das Problem nicht behoben. – tobiasbayer

+0

Ich habe auch gelesen, dass Frühling Autoproxying gilt nur für Frühjahr Bohnen, die konfigurierbar ist nicht. Bitte markieren Sie es als Komponente bitte? Ref - 7.2.2 Einen Aspekt deklarieren http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/aop.html – MikePatel

+0

Ich glaube, Sie verwechseln die Anwendung eines Aspekts mit seiner Definition hier. Die Dokumentation besagt, dass ein Aspekt nur auf eine Spring Bean angewendet werden kann. Das hat nichts mit der Erklärung des Aspekts selbst zu tun. Es muss sogar funktionieren, indem man '' Aspect'' verwendet (ohne '' Configurable'' oder '' @ Component''). In meinem Beispiel ist der Aspekt zusätzlich "@ Configurable", weil das Feld "@ Autowired" injiziert wird. – tobiasbayer

0

Das ist, was ich tue:

<context:annotation-config/> 
<context:component-scan base-package="my.pkg" scoped-proxy="interfaces"/> 
<aop:aspectj-autoproxy proxy-target-class="true" /> 

Obwohl ich kann nicht sagen, ob es in Ihrem Fall funktionieren wird .... es würde helfen, wenn Sie eine abgespeckte Version des Projektes bei Github einrichten.

Dies erfordert keine Byte-Code Weben oder Instrumentierung der JVM. Stellen Sie nur sicher, dass Sie beim Aufruf der betreffenden Methode automatisch injizierte Attribute verwenden, z.

@Autowired 
private MyType myTypeInstance; // MyType is usually an interface 

public void someMethod() { 
    // myTypeInstance is actually a proxy object... thereby providing the 
    // access point for the weaving stuff. (as far as I understand it) 
    myTypeInstance.method(); 
} 

Andernfalls folgen these instructions, wenn Sie die feder verwaltet nicht wie AOP-Klasse-Proxies.

0

Ich glaube, Sie benötigen Aspekt eine Komponente zu machen, um es durch die Feder erkannt zu haben:

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop-at-aspectj

automatischen Erkennung Aspekte durch Komponente Scannen

Sie Aspekt Klassen als reguläre Bohnen können sich registrieren in Ihrer Spring XML-Konfiguration oder automatisch erkennen sie durch Klassenpfad-Scan - wie jede andere Spring-Managed-Bean . Beachten Sie jedoch, dass die @Aspect-Annotation nicht ausreichend ist, um die automatische Erkennung im Klassenpfad zu ermöglichen: Dazu müssen Sie eine separate @Component-Annotation (oder alternativ eine benutzerdefinierte Stereotyp-Annotation hinzufügen, die gemäß den Regeln von Spring entspricht Komponenten-Scanner).

1

In Spring MVC webapps haben Sie tatsächlich 2 Kontexte: den Stammkontext und den Kontext des Servlets. Stellen Sie sicher, dass Sie Ihren Aspekt im Kontext des Servlets konfigurieren. Tatsächlich ist die Servlet-Kontext „sieht“ die Wurzel ein - und nicht umgekehrt:

Im Web-MVC-Framework, die jeweils DispatcherServlet hat seine eigene WebApplicationContext, die in alle Bohnen bereits definiert erbt die Wurzel WebApplicationContext. Diese geerbten Beans können im servletspezifischen Bereich überschrieben werden, und Sie können neue bereichsspezifische Beans lokal für eine bestimmte Servlet-Instanz definieren.

So Ihre Import des Rahmen Config muss vielmehr in der [servlet-name]-servlet.xml Datei gemacht werden als in dem anderen (n), wenn Sie Ihre Aspekte wollen ihre Bohnen angewendet werden.