AOP (Fortgeschritten)

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo,

Mein Problem:

Klasse Test:

Methode A ruft Methode B auf.

Ein Aspekt soll sowohl bei Methode A "triggern", als auch bei dem "verschachtelten" Aufruf von Methode B

Implementierung:

Code:
@Component
@Aspect
public class LoggerAspect {

    @Pointcut(value = "@annotation(utils.TestAnnotation)")
    public void testPointCut() {
    }

    @Around(value = "testPointCut()")
    public Object testBefore(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Hallo");
        joinPoint.proceed(joinPoint.getArgs());
      }
}

Resultat:

Aufruf Methode B "Hallo" (alles korrekt, d.h. der Pointcut funktioniert)

Aufruf Methode A: "Hallo" (erwartet wurde HalloHallo)

Debugger ergibt:
- Der Aspekt wird bei Aufruf von Methode B in A NICHT aufgerufen!

Erklaerung:
Die Methode B wird nicht auf dem Proxy aufgerufen, sondern auf dem "normalen" Object aufgerufen. (durch Debugger bestaetigt!)

Umgebung: Spring AOP 2.5

Meine Frage:

Kann man per AOP auch auf verschachtelte Methodenaufrufe (innerhalb einer Klasse) "zugreifen" oder nicht ?

Anmerkung:

Wenn ein Zugriff nicht moeglich ist, waere doch Logging per AOP fuer die Tonne oder nicht ?

Gruesse und danke fuer die Antworten im Vorraus
 

FArt

Top Contributor
Spring AOP ist kein echtes, vollständiges AOP, aber es bietet bestimmte Features davon für Spring Beans.

Du wirst this nicht mit dem Proxy wrappen können.
Wer ein Bean über den ApplicationContext bezieht, erhält den Proxy, der die Implementierung wrappt. Eine implizite Referenz auf die Implementierung ist natürlich nicht gewrappt.

Echtes AOP kann das natürlich schon...
 
G

Gast(Starter)

Gast
Hallo FArt,

Nach Lektuere der Spring Doku (siehe: 6.6.1. Understanding AOP proxies) ist nur noch folgendes hinzuzufuegen:

public class SimplePojo implements Pojo {
public void foo() {
// this works, but... gah!
((Pojo) AopContext.currentProxy()).bar();
}
public void bar() {
// some logic...
}
}

Waere eine Moeglichkeit.... aber der Kommentar ist glaube ich passend.

Fazit fuer mich ist das z.B. Logging mit Spring-AOP momentan nicht moeglich ist, da simple Selbstaufrufe nicht geloggt werden und ein Refac. des Kodes bei uns nicht moeglich ist !!!!!!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben