[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