Bevezetés a tanácsok típusaiba tavasszal
1. Áttekintés
Ebben a cikkben különféle típusú AOP tanácsokat fogunk tárgyalni, amelyek tavasszal hozhatók létre.
Tanács egy aspektus által egy adott csatlakozási pontban végrehajtott művelet. Különböző típusú tanácsok közé tartoznak a „körülött”, az „előtt” és az „utána” tanácsok. A szempontok fő célja a több területet érintő problémák támogatása, mint például a naplózás, profilalkotás, gyorsítótár és tranzakciókezelés.
És ha mélyebbre akarsz menni a pointcut kifejezésekben, nézd meg ezek előző bevezetőjét.
2. Tanácsadás engedélyezése
A Spring segítségével az AspectJ kommentárok segítségével nyilatkozhat, de előbb meg kell tennie alkalmazza a @EnableAspectJAutoProxy kommentár a konfigurációs osztályhoz, amely lehetővé teszi az AspectJ-ekkel jelölt alkatrészek kezelését @Vonatkozás annotáció.
@Configuration @EnableAspectJAutoProxy public class AopConfiguration {...}
2.1. Tavaszi csizma
A Spring Boot projektekben nem kell kifejezetten a @EnableAspectJAutoProxy. Van egy dedikált AopAutoConfiguration amely lehetővé teszi a Spring AOP támogatását, ha a Vonatkozás vagy Tanács osztályúton van.
3. Tanácsadás előtt
Ezt a tanácsot, ahogy a neve is mutatja, a csatlakozási pont előtt hajtják végre. Kivételt nem vetve nem akadályozza meg az általa ajánlott módszer folytatását.
Vegye figyelembe a következő szempontot, amely egyszerűen naplózza a metódus nevét, mielőtt meghívnák:
@ Component @Aspect public class LoggingAspect {private Logger logger = Logger.getLogger (LoggingAspect.class.getName ()); @Pointcut ("@ target (org.springframework.stereotype.Repository)") public void repositoryMethods () {}; @Before ("repositoryMethods ()") public void logMethodCall (JoinPoint jp) {String methodName = jp.getSignature (). GetName (); logger.info ("Before" + methodName); }}
A logMethodCall A tanácsadást a repositoryMethods pointcut.
4. Tanácsadás után
Tanácsot követően kijelentette a @Utána kommentár, egyeztetett módszer végrehajtása után kerül végrehajtásra, függetlenül attól, hogy kivételt hoztak-e.
Bizonyos szempontból hasonló a végül Blokk. Abban az esetben, ha tanácsra van szüksége, hogy csak a normál végrehajtás után váltson ki, akkor használja a visszatérő tanács nyilatkozta @AfterReturning annotáció. Ha azt szeretné, hogy tanácsát csak akkor indítsa el, amikor a cél módszer kivételt vet, akkor használja dobási tanácsok, használatával deklarált @AfterThrowing annotáció.
Tegyük fel, hogy értesíteni szeretnénk egyes alkalmazás-összetevőket, amikor a Foo létrehozva. Tól közzétehetünk egy eseményt FooDao, de ez sértené az egyetlen felelősség elvét.
Ehelyett ezt a következő szempont meghatározásával valósíthatjuk meg:
@Component @Aspect public class PublishingAspect {private ApplicationEventPublisher eventPublisher; @Autowired public void setEventPublisher (ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher; } @Pointcut ("@ target (org.springframework.stereotype.Repository)") public void repositoryMethods () {} @Pointcut ("végrehajtás (* * .. create * (Long, ..))") public void firstLongParamMethods ( ) {} @Pointcut ("repositoryMethods () && firstLongParamMethods ()") public void entityCreationMethods () {} @AfterReturning (value = "entityCreationMethods ()", returning = "entitás") public void logMethodCall (JoinPoint jp, Object entitás) dobja a Throwable {eventPublisher.publishEvent (új FooCreationEvent (entitás)); }}
Először vegye figyelembe, hogy a @AfterReturning annotációval elérhetjük a cél módszer visszatérési értékét. Másodszor, egy típusú paraméter deklarálásával JoinPoint, hozzáférhetünk a cél módszer meghívásának argumentumához.
Ezután létrehozunk egy figyelőt, amely egyszerűen naplózza az eseményt:
@Component public class A FooCreationEventListener végrehajtja az ApplicationListener {private Logger logger = Logger.getLogger (getClass (). GetName ()); @Orride public void onApplicationEvent (FooCreationEvent event) {logger.info ("Létrehozott foo-példány:" + event.getSource (). ToString ()); }}
5. Tanácsok körül
Tanácsok körül csatlakozási pontot vesz körül, például metódushívást.
Ez a legerősebb tanács. Körülbelül tanácsok hajthatnak végre egyéni viselkedést a módszer meghívása előtt és után is. Feladata annak is a megválasztása, hogy továbblépjen-e a csatlakozási pontra, vagy a saját visszatérési értékének megadásával vagy egy kivétel kiváltásával rövidítse meg a javasolt módszer végrehajtását.
Használatának bemutatásához tegyük fel, hogy meg akarjuk mérni a módszer végrehajtási idejét. Hozzunk létre egy szempontot ehhez:
@Aspect @Component nyilvános osztály PerformanceAspect {private Logger logger = Logger.getLogger (getClass (). GetName ()); @Pointcut ("within (@ org.springframework.stereotype.Repository *)") public void repositoryClassMethods () {}; @Around ("repositoryClassMethods ()") public Object measureMethodExecutionTime (ProceedingJoinPoint pjp) dobja Throwable {long start = System.nanoTime (); Object retval = pjp.proceed (); hosszú vég = System.nanoTime (); String methodName = pjp.getSignature (). GetName (); logger.info ("A" + methodName + "végrehajtása" elvette "+ TimeUnit.NANOSECONDS.toMillis (end - start) +" ms "); return retval; }}
Ez a tanács akkor jelenik meg, ha a csatlakozási pontok bármelyike megfelel a repositoryClassMethods pointcut végrehajtásra kerül.
Ez a tanács egy típusú paramétert vesz fel ProceedingJointPoint. A paraméter lehetőséget ad arra, hogy cselekedjünk a cél módszer hívása előtt. énEbben az esetben egyszerűen elmentjük a módszer kezdési idejét.
Másodszor, a tanácsok visszatérési típusa az Tárgy mivel a target módszer bármilyen típusú eredményt adhat vissza. Ha a cél módszer üres,nulla visszaküldik. A cél módszer hívása után megmérhetjük az időzítést, naplózhatjuk, és a módszer eredményértékét visszaküldhetjük a hívónak.
6. Áttekintés
Ebben a cikkben megismerhettük a tavaszi tanácsok különféle típusait, valamint azok nyilatkozatait és megvalósításait. A szempontokat séma-alapú megközelítés és AspectJ annotációk segítségével határoztuk meg. Számos lehetséges tanácsadó alkalmazást is rendelkezésre bocsátottunk.
Mindezen példák és kódrészletek megvalósítása megtalálható a GitHub projektemben.