DarthShader
Erfahrenes Mitglied
Hallo zusammen,
ich habe eine Frage bezüglich AOP, der Verwendung von Spring / AspectJ / CGLIB. Ich scheine alles korrekt eingebunden und konfiguriert zu haben, dennoch wird mein Advice, der einfach vor einem Methodenaufruf testweise etwas auf der Konsole ausgeben soll, nicht aufgerufen.
Der entscheidende Teil meiner Context-Konfiguration sieht so aus:
Die Klasse TestAspect sieht so aus:
Die Methode
ist sehr einfach gehalten:
Das Programm starte ich mit dem Parameter
Problem:
Wenn die Methode "login()" innerhalb des Programmes aufgerufen wird, was ich an der Ausgabe "login()" sehe, dann wird der Advice aber nicht ausgeführt, d.h. ich sehe kein "doBefore()" auf der Konsole - es werden auch keine Exceptions geworfen.
Weitere Informationen:
Erkenntnisse:
Unsicherhiten / Offene Fragen:
(siehe oben) angebe, so wie ich es gemacht habe (wie oben erwähnt funktioniret es ja auch ohne CGLIB, also mit Java Proxys / Spring AOP)
Ich habe irgendwie das Gefühl, dass ich eine Kleinigkeit vergessen habe. Insbesondere weil es mit Spring AOP und den Interface-Proxies ja funktioniert, dürfte die Konfiguration ja nicht all zu falsch sein.
Leider komme ich an dieser Stelle nicht mehr weiter - über Eure Hilfe würde ich mich wirklich sehr freuen
Vielen Dank!
ich habe eine Frage bezüglich AOP, der Verwendung von Spring / AspectJ / CGLIB. Ich scheine alles korrekt eingebunden und konfiguriert zu haben, dennoch wird mein Advice, der einfach vor einem Methodenaufruf testweise etwas auf der Konsole ausgeben soll, nicht aufgerufen.
Der entscheidende Teil meiner Context-Konfiguration sieht so aus:
XML:
<context:load-time-weaver aspectj-weaving="on" />
<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id="testAspect" class="de.test.aop.TestAspect" />
Die Klasse TestAspect sieht so aus:
Java:
@Aspect
public class TestAspect {
@Before( "execution(public void de.test.LoginController.login())" )
public void doBefore() {
System.err.println( "doBefore()" );
}
}
Die Methode
Java:
de.test.LoginController.login()
Java:
public void login()
{
System.err.println( "login()" );
// Weiterer Code hier
}
Das Programm starte ich mit dem Parameter
Code:
-javaagent:../Lib/lib/Spring/spring-agent.jar
Problem:
Wenn die Methode "login()" innerhalb des Programmes aufgerufen wird, was ich an der Ausgabe "login()" sehe, dann wird der Advice aber nicht ausgeführt, d.h. ich sehe kein "doBefore()" auf der Konsole - es werden auch keine Exceptions geworfen.
Weitere Informationen:
- Das Programm läuft in keinem Application Container, ist keine Web-Application
- Es handelt sich um eine "normale" Spring Application
- Die Klasse "LoginController" ist eine Spring Bean, allerdings hatte ich es auch auf einer normalen Klasse getestet, die via "new" zur Laufzeit instanziiert wird, auch damit ging es nicht
Erkenntnisse:
- Die Libs sind korrekt eingebunden (würde eine fehlen, gäbe es schon Meldungen beim Start, das habe ich bereits hinter mir...), eingebunden sind: spring.jar, spring-aspects.jar, spring-agent.jar, aspectjrt.jar, aspectjweaver.jar
- Der Java-Agent wird gefunden, sonst würde die JVM beim Start eine entsprechende Fehlermeldung ausgeben
- Wenn ich von CGLIB auf Spring AOP mit Interfaces umstelle, funktioniert der Advice. D.h. wenn "LoginController" ein Interface ist, in dem die "login()" Methode definiert wurde, klappt es. Sobald ich ein Proxy einer Klasse mit CGLIB erstellen will, klappt es nicht mehr (leider bin ich auf Load-Time-Weaving / AspectJ und damit CGLIB angewiesen)
- Der Aspekt (TestAspect) wird auch "bachtet", d.h. wenn ich den Ausdruck in @Before auf etwas ungültiges setze, dann meckert der Parser von AspectJ
Unsicherhiten / Offene Fragen:
- Ich habe keine META-INF/aop.xml Konfigurationsdatei, aber wenn ich es richtig verstehe, ist dies auch nicht nötig, wenn ich
Code:
aspectj-weaving="on"
Ich habe irgendwie das Gefühl, dass ich eine Kleinigkeit vergessen habe. Insbesondere weil es mit Spring AOP und den Interface-Proxies ja funktioniert, dürfte die Konfiguration ja nicht all zu falsch sein.
Leider komme ich an dieser Stelle nicht mehr weiter - über Eure Hilfe würde ich mich wirklich sehr freuen
Vielen Dank!
Zuletzt bearbeitet von einem Moderator: