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.