[Javalist] Spring AOP advice nem fut
István Székely
istvan.szekely1 at gmail.com
2013. Okt. 6., V, 16:11:56 CEST
Sziasztok!
Előzetesen még egyszer leírom, hogy most már működik a dolog, de mivel
hasznos dolgokat írtok, és érdekelnek a vélemények és a szép megoldás,
vigyük tovább a szálat.
Alapvetően két forgatókönyv volt. Az egyiket csak zárójelben jegyeztem meg
korábban, viszont most ezt fogom kifejteni. Tehát a felállás az alábbi:
1. Bizonyos metódusok lefutásáról statisztikát kell készítsünk. Eddig a
számlálók növelése bele volt drótozva minden egyes ilyen metódusba.
Szerintem abban egyetértünk, hogy ez nem volt túl jó megoldás, ezért
szerettük volna AOP-vel megcsinálni. (Itt volt az első ellenvetésetek, hogy
az AOP-t nem arra próbáljuk használni, amire való. Most már ismert a
feladat is.)
2. Adott egy osztály, aminek ismert a forrása, de nem tudom módosítani.
Tekintsünk rá úgy, mint egy 3rd party framework osztályra. Ebben van
definiálva a() és b() a már ismertetett módon.
public abstract class FrameworkClass {
public void a() {
...
b();
...
}
public abstract void b();
}
3. Adott a mi kis alkalmazásunk, amiben statisztikákat kellene gyűjteni a
konkrét b() hívásokról. Erre szerettünk volna egy aspectet csinálni (ami
egy bizonyos annotációt meglétét ellenőrzi a pointcut-ban).
public class MyVeryImportantTask extends FrameworkClass {
@Statistics
@Override
public void b() {
...
}
}
Ti hogyan oldanátok meg ezt a konkrét feladatot?
2013. október 4. 16:35 Peter Verhas írta, <peter at verhas.ch>:
> 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
>
>
Péter, tulajdonképpen pont ez történik, amikor az
AopContext.currentProxy()-t használjuk, csak akkor nem kívülről állítjuk be
a proxyt az advised osztálynak, hanem hagyjuk, hogy ő maga kérje el a saját
proxy-ját a context-ből. Nem próbáltam ki, de bizonyára a te megoldásod is
működne.
Üdv,
Stivi
--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: <http://lists.javaforum.hu/pipermail/javalist/attachments/20131006/117dcfbf/attachment.html>
További információk a(z) Javalist levelezőlistáról