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ák ‘Tavaszi 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.