[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