Spring AOP mit AspectJ und CGLIB - Advice wird einfach nicht aufgerufen

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:

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()
ist sehr einfach gehalten:

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"
(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!
 
Zuletzt bearbeitet von einem Moderator:
Hallo nochmal,

hat keiner eine Idee? Ich komme an dieser Stelle nicht weiter. Ist ne dumme Situation, wenn man keine Fehlermeldung erhält und nix...

Ich bin für jeden Tipp dankbar!
 
Zurück