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.