Egyéni tavaszi AOP-kommentár megvalósítása

1. Bemutatkozás

Ebben a cikkben egy egyéni AOP-kommentárral fogjuk megvalósítani az AOP-támogatást tavasszal.

Először adunk egy magas szintű áttekintést az AOP-ról, elmagyarázva, mi ez és milyen előnyökkel jár. Ezt követően lépésről lépésre végrehajtjuk az annotációnkat, fokozatosan kialakítva az AOP koncepcióinak mélyebb megértését.

Ennek eredménye az AOP jobb megértése és a jövőbeni egyedi tavaszi kommentárok létrehozásának képessége lesz.

2. Mi az AOP kommentár?

A gyors összefoglalás érdekében az AOP a szempont-orientált programozást jelenti. Lényegében, ez a módszer a viselkedés hozzáadásához a meglévő kódhoz anélkül, hogy módosítaná a kódot.

Az AOP részletes bemutatásához cikkek találhatók az AOP pontokról és tanácsokról. Ez a cikk feltételezi, hogy már rendelkezünk alapvető ismeretekkel.

Az AOP típusa, amelyet ebben a cikkben bevezetünk, annotáció alapú. Lehet, hogy ezt már ismerjük, ha a tavaszt használtuk @ Tranzakció kommentár:

@Transactional public void orderGoods (Order order) {// tranzakcióban végrehajtandó adatbázis-hívások sora}

A legfontosabb itt a non-invazivitás. A jegyzetek metaadatainak felhasználásával az alapvető üzleti logikánk nem szennyezett a tranzakciós kódunkkal. Ez megkönnyíti az okfejtést, a refaktort és az izolált tesztelést.

Előfordul, hogy a tavaszi alkalmazásokat fejlesztő emberek ezt látjákTavaszi varázslat ”, anélkül, hogy nagyon részletesen átgondolnám a működését. A valóságban a történések nem különösebben bonyolultak. Miután azonban elvégeztük a cikk lépéseit, képesek leszünk létrehozni saját egyéni feljegyzésünket az AOP megértése és kihasználása érdekében.

3. Maven-függőség

Először tegyük hozzá Maven-függőségeinket.

Ebben a példában a Spring Boot alkalmazást fogjuk használni, mivel a konfigurációkon alapuló megközelítés lehetővé teszi, hogy a lehető leggyorsabban induljunk és fussunk:

 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE org.springframework.boot spring-boot-starter-aop 

Ne feledje, hogy belefoglaltuk az AOP indítót, amely behúzza azokat a könyvtárakat, amelyekre szükségünk van a szempontok megvalósításához.

4. Saját kommentár létrehozása

Az általunk létrehozandó kommentár segítségével regisztrálhatjuk, mennyi időbe telik egy módszer végrehajtása. Készítsük el a kommentárunkat:

@Target (ElementType.METHOD) @Retention (RetentionPolicy.RUNTIME) public @interface LogExecutionTime {} 

Bár viszonylag egyszerű megvalósítás, érdemes megjegyezni, hogy mire használják a két meta-annotációt.

A @Cél az annotáció megmondja, hogy hol lesz alkalmazva az annotációnk. Itt használjuk ElementType.Method, ami azt jelenti, hogy csak módszereken fog működni. Ha bárhol másutt próbálnánk használni a megjegyzéseket, akkor a kódunkat nem sikerül lefordítanunk. Ennek a viselkedésnek van értelme, mivel az annotációnkat felhasználjuk a naplózási módszer végrehajtási idejére.

És @Visszatartás csak azt mondja meg, hogy a jegyzet futás közben elérhető lesz-e a JVM számára, vagy sem. Alapértelmezés szerint nem, így a tavaszi AOP nem látja a kommentárokat. Ezért alakították át.

5. A szempontunk megalkotása

Most megvan a megjegyzésünk, alkossuk meg a szempontunkat. Ez csak az a modul, amely átfogja az átfogó aggodalmainkat, amely esetünkben a módszer végrehajtási idő naplózása. Ez csak egy osztály, azzal van kiegészítve @Vonatkozás:

@Aspect @Component public class ExampleAspect {}

Mi is felvettük a @Összetevő annotáció, mivel osztályunknak tavaszi babnak is kell lennie, hogy észlelhető legyen. Lényegében ez az osztály, ahol meg fogjuk valósítani azt a logikát, hogy azt akarjuk, hogy az egyedi kommentárunk beadja.

6. Pontok és tanácsok létrehozása

Most készítsük el a pontokat és tanácsokat. Ez egy kommentált módszer lesz, amely a mi szempontunkban él:

@Around ("@ annotation (LogExecutionTime)") public Object logExecutionTime (ProceedingJoinPoint joinPoint) dobja Throwable {return joinPoint.proceed (); }

Technikailag ez még nem változtatja meg semmi viselkedését, de még mindig nagyon sok minden elemzésre szorul.

Először is megjegyeztük módszerünket @Körül. Ez a mi tanácsunk, és a tanácsok azt jelentik, hogy extra kódot adunk a módszer végrehajtása előtt és után is. Vannak más típusú tanácsok is, például előtt és utána de kimaradnak e cikk hatálya alól.

Ezután a mi @Körül az annotációnak van egy pontvágású argumentuma. Pontos mondásunk csak annyit mond: „Alkalmazza ezt a tanácsot bármelyik módszerrel, amelyhez jegyzeteket fűzött @LogExecutionTime. ” Rengeteg más típusú pontvágó van, de a hatókör ismét kimarad.

A módszer, a metódus logExecutionTime () maga a tanácsunk. Van egyetlen érv, ProceedingJoinPoint. Esetünkben ez egy végrehajtási módszer lesz, amellyel jegyzetelt @LogExecutionTime.

Végül, amikor az annotált módszerünket végül meghívják, mi fog történni, az lesz a tanácsunk, amelyet először hívunk. Akkor a mi tanácsunkon múlik, hogy mi legyen a következő lépés. Esetünkben a tanácsunk nem más, mint hívás folytassa(), amely éppen az eredeti jegyzetelt metódust hívja meg.

7. Végrehajtási időnk naplózása

Most már a helyén van a csontvázunk, csak annyit kell tennünk, hogy adjunk néhány extra logikát a tanácsunkhoz. Ez lesz az, ami naplózza a végrehajtási időt az eredeti módszer meghívása mellett. Adjuk hozzá ezt a további viselkedést tanácsainkhoz:

@Around ("@ annotation (LogExecutionTime)") public Object logExecutionTime (ProceedingJoinPoint joinPoint) dob dobható {long start = System.currentTimeMillis (); Objektum folytatása = joinPoint.proceed (); hosszú végrehajtási idő = System.currentTimeMillis () - start; System.out.println (joinPoint.getSignature () + "végrehajtva" + végrehajtási idő + "ms" alatt); visszatérés folytatása; }

Itt megint nem tettünk semmit, ami különösebben bonyolult lenne. Most rögzítettük az aktuális időt, végrehajtottuk a módszert, majd kinyomtattuk a konzolra szükséges időt. Naplózza a metódus aláírását is, amelyet a csatlakozási pont példa. Más információhoz is hozzáférhetnénk, ha szeretnénk, például a metódus-argumentumokhoz.

Most próbáljuk meg megjegyezni a metódust @LogExecutionTime, majd végrehajtja, hogy lássa, mi történik. Ne feledje, hogy ennek megfelelően kell működnie egy tavaszi babnak:

@LogExecutionTime public void serve () dobja az InterruptedException {Thread.sleep (2000); }

A végrehajtás után a következőket kell látni naplózva a konzolon:

void org.baeldung.Service.serve () 2030ms-ben végrehajtva

8. Következtetés

Ebben a cikkben kihasználtuk a Spring Boot AOP-t, hogy létrehozzuk az egyedi kommentárokat, amelyeket a Spring babra alkalmazhatunk, hogy futás közben extra viselkedést juttassunk hozzájuk.

Alkalmazásunk forráskódja a GitHub-on keresztül elérhető; ez egy Maven projekt, amelyet képesnek kell lennie a jelenlegi állapotban történő futtatásra.