Bevezetés az AspectJ-be
1. Bemutatkozás
Ez a cikk a gyors és praktikus bevezetés az AspectJ-be.
Először bemutatjuk, hogyan lehet engedélyezni a szempont-orientált programozást, majd a fordítási idő, a fordítás utáni és a betöltési idő szövése közötti különbségre összpontosítunk.
Kezdjük a szempont-orientált programozás (AOP) és az AspectJ alapjainak rövid bemutatásával.
2. Áttekintés
Az AOP egy olyan programozási paradigma, amelynek célja a modularitás növelése azáltal, hogy lehetővé teszi az átfogó kérdések elkülönítését. Ezt úgy teszi, hogy további viselkedést ad hozzá a meglévő kódhoz, a kód módosítása nélkül. Ehelyett külön deklaráljuk, melyik kódot kell módosítani.
Az AspectJ a Java programozási nyelv kiterjesztéseivel megvalósítja az aggodalmakat és az átfogó aggályokat.
3. Maven-függőségek
Az AspectJ használatától függően különböző könyvtárakat kínál. A Maven-függőségeket az org.aspectj csoport alatt találhatjuk meg a Maven Central adattárban.
Ebben a cikkben a szempontok létrehozásához szükséges függőségekre összpontosítunk, és Weaver a fordítási idő, a fordítás utáni és a betöltési idejű takácsok használatával.
3.1. AspectJ futásidejű
AspectJ program futtatásakor az osztályútnak tartalmaznia kell az osztályokat és szempontokat, valamint az AspectJ futásidejű könyvtárat aspektjrt.jar:
org.aspectj aspektjrt 1.8.9
Ez a függőség a Maven Centralon érhető el.
3.2. AspectJWeaver
Az AspectJ futásidejű függőség mellett a aspjweaver.jar tanácsokat adni a Java osztálynak betöltéskor:
org.aspectj szempontjweaver 1.8.9
A függőség a Maven Central-on is elérhető.
4. A szempont létrehozása
Az AspectJ biztosítja az AOP megvalósítását és rendelkezik három alapvető fogalom:
- Csatlakozzon a Pointhoz
- Pointcut
- Tanács
Ezeket a fogalmakat egy egyszerű program létrehozásával mutatjuk be a felhasználói fiók egyenlegének érvényesítésére.
Először hozzunk létre egy Számla osztály egy adott egyenleggel és a kivonás módszerével:
nyilvános osztály Számla {int egyenleg = 20; nyilvános logikai visszavonás (int összeg) {if (egyenleg <összeg) {return hamis; } egyenleg = egyenleg - összeg; return true; }}
Létrehozunk egy AccountAspect.aj fájlt a fiókadatok naplózásához és a számlaegyenleg érvényesítéséhez (vegye figyelembe, hogy az AspectJ fájlok „.aj" fájlkiterjesztés):
public aspektus AccountAspect {final int MIN_BALANCE = 10; pointcut callWithDraw (int összeg, Account acc): hívás (logikai számla.withdraw (int)) && args (összeg) && target (acc); előtte (int összeg, Számla acc): callWithDraw (összeg, acc) {} logikai érték körül (int összeg, Számla acc): callWithDraw (összeg, acc) {if (egyenleg <összeg) {return false; } visszatérési folyamat (összeg, acc); } után (int összeg, számlaegyenleg): callWithDraw (összeg, egyenleg) {}}
Mint láthatjuk, felvettük a pointcut a visszavonási módszerhez és hármat létrehozott tanácsolja amelyek a meghatározottakra utalnak pointcut.
A következők megértése érdekében a következő meghatározásokat vezetjük be:
- Vonatkozás: Több objektumot átfogó aggály modulálása. Minden szempont egy adott keresztmetszeti funkcióra összpontosít
- Csatlakozási pont: Egy pont a szkript végrehajtása során, például egy metódus vagy a tulajdonhoz való hozzáférés végrehajtása
- Tanács: Egy szempont által egy adott csatlakozási pontban végrehajtott művelet
- Pointcut: A csatlakozási pontokkal egyező reguláris kifejezés. Egy tanács egy pointcut kifejezéshez van társítva, és minden olyan csatlakozási ponton fut, amely megfelel a pointcutnak
Ezekről a fogalmakról és azok konkrét szemantikájáról további részleteket a következő linken tehetünk meg.
Ezután be kell szúrnunk a szempontokat a kódunkba. Az alábbi szakaszok a szövés három különböző típusával foglalkoznak: fordítási idejű szövés, fordítás utáni szövés és terhelés-idő szövés az AspectJ-ben.
5. Összeállítású szövés
A szövés legegyszerűbb megközelítése a fordítási idejű szövés. Ha megvan mind a szempont forráskódja, mind pedig az a kód, amelyben aspektusokat használunk, az AspectJ fordító forrásból fordít és kimenetként egy szövött osztályfájlt állít elő. Ezután a kód végrehajtása után a szövési folyamat kimeneti osztálya normál Java osztályként kerül betöltésre a JVM-be.
Letölthetjük az AspectJ fejlesztőeszközöket, mivel tartalmaz egy mellékelt AspectJ fordítót. Az AJDT egyik legfontosabb jellemzője a több területet érintő problémák vizualizálásának eszköze, amely segítséget nyújt a pointcut specifikáció hibakeresésében. A kombinált effektust még a kód telepítése előtt vizualizálhatjuk.
A Mojo AspectJ Maven beépülő moduljával AspectJ szempontokat szőünk be osztályainkba az AspectJ fordító segítségével.
org.codehaus.mojo szempontj-maven-plugin 1.7 1.8 1.8 1.8 true true ignore UTF-8 compile test-compile
Ha többet szeretne tudni az AspectJ fordító opció hivatkozásáról, érdemes megnézni a következő linket.
Adjunk hozzá néhány tesztesetet a Számla osztályunkhoz:
public class AccountTest {private Account account; @A nyilvános érvénytelenítés előtt () {account = new Account (); } @Test public void given20AndMin10_whenWithdraw5_thenSuccess () {assertTrue (account.withdraw (5)); } @Test public void given20AndMin10_whenWithdraw100_thenFail () {assertFalse (account.withdraw (100)); }}
A tesztesetek futtatásakor a konzolon megjelenő alábbi szöveg azt jelenti, hogy sikeresen szőttük a forráskódot:
[INFO] Csatlakozási pont 'metódus-hívás (logikai com.baeldung.aspectj.Account.withdraw (int))' a 'com.baeldung.aspectj.test.AccountTest' (AccountTest.java:20) típusban: 'com.baeldung.aspectj.AccountAspect' (AccountAspect.class: 18 (from AccountAspect.aj)) [INFO] Csatlakozási pont 'method-call (logikai com.baeldung.aspectj.Account.withdraw (int))' in Type ' com.baeldung.aspectj.test.AccountTest (AccountTest.java:20), amelyet a „com.baeldung.aspectj.AccountAspect” (AccountAspect.class: 13 (from AccountAspect.aj)) tanácsai tanácsoltak [INFO] Csatlakozási pont ' method-call (logikai com.baeldung.aspectj.Account.withdraw (int)) 'a' com.baeldung.aspectj.test.AccountTest '(AccountTest.java:20) típusban: a com.baeldung.aspectj tanácsa .AccountAspect '(AccountAspect.class: 26 (from AccountAspect.aj)) 2016-11-15 22:53:51 [main] INFO com.baeldung.aspectj.AccountAspect - Egyenleg visszavonás előtt: 20 2016-11-15 22: 53:51 [main] INFO com.baeldung.aspectj.AccountAspect - Kivonás visszavonása: 5 2016 -11-15 22:53:51 [main] INFO com.baeldung.aspectj.AccountAspect - Egyenleg visszavonás után: 15 2016-11-15 22:53:51 [main] INFO com.baeldung.aspectj.AccountAspect - Egyenleg visszavonás: 20 2016-11-15 22:53:51 [main] INFO com.baeldung.aspectj.AccountAspect - Munka visszavonása: 100 2016-11-15 22:53:51 [main] INFO com.baeldung.aspectj.AccountAspect - Az elállást elutasították! 2016-11-15 22:53:51 [main] INFO com.baeldung.aspectj.AccountAspect - Egyenleg visszavonás után: 20
6. Összeállítás utáni szövés
A fordítás utáni szövést (más néven bináris szövést) a meglévő osztályfájlok és JAR fájlok szövésére használják. Csakúgy, mint a fordítási idejű szövésnél, a szövéshez használt szempontok lehetnek forrás vagy bináris formában, és maguk is szövődhetnek szempontok szerint.
Ahhoz, hogy ezt a Mojo AspectJ Maven beépülő moduljával tudjuk elvégezni, be kell állítanunk az összes JAR fájlt, amelyet be akarunk szőni a plugin konfigurációjában:
org.group to weaw org.anothergroup gen
A szövendő osztályokat tartalmazó JAR fájlokat a következőként kell feltüntetni a Maven projektben, és mint
ban,-ben
az AspectJ Maven beépülő modul.
7. Terheléses szövés
A betöltési idejű szövés egyszerűen bináris szövés, elhalasztva addig a pontig, amíg egy osztálybetöltő osztályfájlt tölt be és meghatározza az osztályt a JVM számára.
Ennek támogatásához egy vagy több „szövő osztályos rakodóra” van szükség. Ezeket vagy kifejezetten a futási környezet biztosítja, vagy engedélyezik egy „szövőanyag” használatával.
7.1. A betöltési idejű szövés engedélyezése
Az AspectJ betöltési idejű szövés engedélyezhető az AspectJ ügynök segítségével, amely bekapcsolódhat az osztálybetöltési folyamatba és bármilyen szövést szőhet, mielőtt azokat meghatározná a virtuális gép. Megadjuk a javaagent opciót a JVM-hez -javaagent: pathto / aspektjweaver.jar vagy a Maven plugin segítségével konfigurálhatjuk a javaagent :
org.apache.maven.plugins maven-surefire-plugin 2.10 -javaagent: "$ {settings.localRepository}" / org / aspektj / aspektjweaver / $ {aspektj.version} / aspektjweaver - $ {aspektj.version} .jar igaz mindig
7.2. Konfigurációs takács
Az AspectJ betöltési idejű szövőanyagát a aop.xml fájlokat. Egyre vagy többre keres aop.xml fájlok az osztályúton a META-INF könyvtárat és összesíti a tartalmat a takács konfigurációjának meghatározása érdekében.
An aop.xml a fájl két kulcsfontosságú részt tartalmaz:
- Szempontok: meghatároz egy vagy több szempontot a szövő számára, és ellenőrzi, hogy mely szempontokat kell használni a szövési folyamatban. A szempontok elem adott esetben tartalmazhat egy vagy több tartalmazza és kizárni elemek (alapértelmezés szerint az összes meghatározott szempontot használják a szövéshez)
- Takács: meghatározza a takács lehetőségeit a szövőnek, és meghatározza a szövendő típusok halmazát. Ha nincs megadva tartalmazza az elem, akkor a szövő számára látható összes típus szövődik
Konfiguráljunk egy szempontot a takácshoz:
Mint láthatjuk, beállítottunk egy aspektust, amely a AccountAspect, és csak a forráskód a com.baeldung.aspectj csomagot az AspectJ szövi.
8. A szempontok kommentálása
Az AspectJ 5 a megszokott AspectJ kód alapú aspektusdeklarációs stílus mellett az aspektusdeklaráció annotáción alapuló stílusát is támogatja. Az ezt a fejlesztési stílust támogató kommentárok sorozatát informálisan@AspectJ”Feliratokat.
Készítsünk kommentárokat:
@Retention (RetentionPolicy.RUNTIME) @Target (ElementType.METHOD) public @interface Secured {public boolean isLocked () default false; }
Használjuk a @ Biztonságos kommentár a módszer engedélyezéséhez vagy letiltásához:
public class SecuredMethod {@Secured (isLocked = true) public void lockedMethod () {} @Secured (isLocked = false) public void unlockedMethod () {}}
Ezután hozzáadunk egy aspektust az AspectJ kommentár stílusával, és ellenőrizzük az engedélyt a @Secured kommentár attribútuma alapján:
@Aspect public class SecuredMethodAspect {@Pointcut ("@ annotation (Secured)") public void callAt (Secured Secured) {} @Around ("callAt (Secured)") public Object around (ProceedingJoinPoint pjp, Secured Secured) dobja Throwable {return biztosított.isLocked ()? null: pjp.proceed (); }}
Az AspectJ annotációs stílusával kapcsolatos további részletekért tekintse meg a következő linket.
Ezután az osztályunkat és a szempontunkat szövjük meg a betöltési idejű takács és put használatával aop.xml alatt META-INF mappa:
Végül hozzáadjuk az egységtesztet és ellenőrizzük az eredményt:
@Test public void testMethod () dobja a Kivételt {SecuredMethod service = new SecuredMethod (); service.unlockedMethod (); service.lockedMethod (); }
A tesztesetek futtatásakor ellenőrizhetjük a konzol kimenetét, hogy megbizonyosodjunk arról, hogy a forráskódban sikeresen szőttük be szempontunkat és osztályunkat:
[INFO] Csatlakozási pont 'method-call (void com.baeldung.aspectj.SecuredMethod.unlockedMethod ())' a 'com.baeldung.aspectj.test.SecuredMethodTest' (SecuredMethodTest.java:11) típusban: com.baeldung.aspectj.SecuredMethodAspect '(SecuredMethodAspect.class (from SecuredMethodAspect.java)] 2016-11-15 22:53:51 [main] INFO com.baeldung.aspectj.SecuredMethod - unlockedMethod 2016-11-15 22:53 : 51 [main] INFO cbaspectj.SecuredMethodAspect - public void com.baeldung.aspectj.SecuredMethod.lockedMethod () zárolva
9. Következtetés
Ebben a cikkben az AspectJ bevezető fogalmaival foglalkoztunk. Részletekért nézze meg az AspectJ kezdőlapját.
A cikk forráskódját a GitHubon találja meg.