[Javalist] Spring AOP advice nem fut

Peter Verhas peter at verhas.ch
2013. Okt. 4., P, 16:35:06 CEST


Quoting Zsombor <gzsombor at gmail.com>:

> Valszeg amúgy azért működik így, mert a proxy egy külön objektum példány,
> ami csak delegálja a valós példányhoz a metódus hívásokat, miután lekezeli
> az interceptor hívásokat.

Biztos, hogy azért nem működik így. A Spring AOP nem nyúl bele a  bájt  
kódba, mint az AspectJ, csak proxy objektumokat hoz létre, és azokban  
interceptorokat. Amikor pedig az IOC konténer része injektál (DI),  
akkor nem az "eredeti" objektumot injektálja, hanem a közben szintén  
létrehozott proxy-t. Ennek megfelelően, bár a Spring az aspektusok  
definíciójára az AspectJ szintakszisát használja, nem lehet mindent  
megcsinálni vele, amit AspectJ-vel.

Amikor egy osztályon belül hívsz meg egy privát metódust, akkor hiába van egy

proxy -> this

objektumod, ahol a proxy.a() implementálja az interceptor  
funckcionalitást mielőtt meghívja a this.a() metódust, mert az  
objektumon belül a hívás, by default a this.a() metódust hívja meg.

Példaképpen próbáld meg az X osztályodban egy

X me;
void setMe(X me){ this.me = me;}

setterrel beállítani, hogy ő kicsoda kívülről, onnan, ahol feteehetően  
a proxy-t látod, és utána a me.a()-val meghívni az a()-t. Működni fog  
az AOP. Persze nem ez a megoldás, hanem

1. Elgondolkodni, hogy hol van elrontva a program modelled, ami miatt  
ilyesmire lenne szükséges.

2. Ha mindenképpen, akkor AspectJ, vagy valami durva Groovy closure  
meta class meg hasonlók.

Én az 1-et ajánlom.

Dipl. Ing. Peter Verhas
peter at verhas.ch
skype: verhas
Mobile: +41 79 154 2095
Arbeit: +41 44 239 8037

----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.


További információk a(z) Javalist levelezőlistáról