Úvod do typov rád na jar

1. Prehľad

V tomto článku sa budeme zaoberať rôznymi typmi rád AOP, ktoré je možné vytvoriť na jar.

Rada je akcia vykonaná aspektom v konkrétnom spojovacom bode. Medzi rôzne typy rád patria rady „okolo“, „pred“ a „po“. Hlavným účelom aspektov je podpora prierezových záujmov, ako je ťažba dreva, profilovanie, ukladanie do pamäte cache a správa transakcií.

A ak sa chcete hlbšie venovať bodovým výrazom, pozrite si predchádzajúce úvodné slovo.

2. Povolenie poradenstva

V rámci jari môžete deklarovať radu pomocou anotácií AspectJ, ale musíte najskôr uplatniť @EnableAspectJAutoProxy anotácia k vašej konfiguračnej triede, ktorá umožní podporu pre prácu s komponentmi označenými AspectJ @Aspect anotácia.

@Configuration @EnableAspectJAutoProxy verejná trieda AopConfiguration {...}

2.1. Jarná topánka

V projektoch Spring Boot nemusíme explicitne používať znak @EnableAspectJAutoProxy. Je tu oddaný AopAutoConfiguration ktorý umožňuje jarnú podporu AOP, ak Aspekt alebo Rada je na triednej ceste.

3. Pred poradenstvom

Táto rada, ako už z názvu vyplýva, sa vykonáva pred spojovacím bodom. Nebráni to ďalšiemu vykonávaniu odporúčanej metódy, pokiaľ nie je vyvolaná výnimka.

Zvážte nasledujúci aspekt, ktorý jednoducho zaznamená názov metódy pred jej volaním:

@Component @Aspect verejná trieda 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 ("Pred" + nazov metody); }}

The logMethodCall rada bude vykonaná pred akoukoľvek metódou úložiska definovanou repositoryMethods pointcut.

4. Po porade

Po odporúčaní deklarované pomocou @ Potom anotácia, sa vykoná po vykonaní zhodnej metódy bez ohľadu na to, či bola alebo nebola vyvolaná výnimka.

V niečom je to podobné ako a konečne blokovať. V prípade, že potrebujete radu spustiť až po bežnom vykonaní, mali by ste použiť spätné poradenstvo vyhlásil @AfterReturning anotácia. Ak chcete, aby sa vaše rady spustili, až keď cieľová metóda vyvolá výnimku, mali by ste použiť vrhacie rady, deklarované pomocou @AfterThrowing anotácia.

Predpokladajme, že chceme upozorniť niektoré komponenty aplikácie na novú inštanciu súboru Foo je vytvorený. Mohli by sme zverejniť udalosť z FooDao, ale porušilo by to zásadu jedinej zodpovednosti.

Namiesto toho to môžeme dosiahnuť definovaním nasledujúceho aspektu:

@Component @Aspect verejná trieda PublishingAspect {private ApplicationEventPublisher eventPublisher; @Autowired public void setEventPublisher (ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher; } @Pointcut ("@ target (org.springframework.stereotype.Repository)") public void repositoryMethods () {} @Pointcut ("execution (* * .. create * (Long, ..))") public void firstLongParamMethods ( ) {} @Pointcut ("repositoryMethods () && firstLongParamMethods ()") public void entityCreationMethods () {} @AfterReturning (value = "entityCreationMethods ()", návrat = "entity") public void logMethodCall (joinPoint jp, entita objektu) hodí Throwable {eventPublisher.publishEvent (nový FooCreationEvent (entita)); }}

Najprv si všimnite, že pomocou @AfterReturning anotácie môžeme získať návratovú hodnotu cieľovej metódy. Po druhé, vyhlásením parametra typu JoinPoint, môžeme pristupovať k argumentom vyvolania cieľovej metódy.

Ďalej vytvoríme poslucháča, ktorý udalosť jednoducho zaznamená:

@Component public class FooCreationEventListener implementuje ApplicationListener {private Logger logger = Logger.getLogger (getClass (). GetName ()); @Override public void onApplicationEvent (udalosť FooCreationEvent) {logger.info ("Vytvorená inštancia foo:" + event.getSource (). ToString ()); }}

5. Okolo rady

Okolo rady obklopuje bod spojenia, napríklad vyvolanie metódy.

Toto je najsilnejšia rada. Všeobecné poradenstvo môže vykonávať vlastné správanie pred aj po vyvolaní metódy. Je tiež zodpovedné za výber, či pokračovať k bodu spojenia alebo skrátiť vykonanie odporúčanej metódy poskytnutím vlastnej návratovej hodnoty alebo udelením výnimky.

Na demonštráciu jeho použitia predpokladajme, že chceme merať čas vykonania metódy. Vytvorme pre to Aspekt:

@Aspect @Component verejná trieda PerformanceAspect {private Logger logger = Logger.getLogger (getClass (). GetName ()); @Pointcut ("within (@ org.springframework.stereotype.Repository *)") public void repositoryClassMethods () {}; @Around ("repositoryClassMethods ()") public Object measureMethodExecutionTime (ProceedingJoinPoint pjp) hodí Throwable {long start = System.nanoTime (); Objekt retval = pjp.proceed (); dlhý koniec = System.nanoTime (); Reťazec methodName = pjp.getSignature (). GetName (); logger.info ("Vykonanie" + methodName + "trvalo" + TimeUnit.NANOSECONDS.toMillis (end - start) + "ms"); spiatočná odveta; }}

Táto rada sa aktivuje, keď sa niektorý zo spojovacích bodov zhoduje s repositoryClassMethods pointcut je vykonaný.

Táto rada má jeden parameter typu ProceedingJointPoint. Parameter nám dáva príležitosť konať pred volaním cieľovej metódy. JaV tomto prípade jednoducho uložíme čas začiatku metódy.

Po druhé, typ vrátenia pomoci je Objekt pretože cieľová metóda môže vrátiť výsledok ľubovoľného typu. Ak je cieľová metóda neplatný,nulový budú vrátené. Po vyvolaní cieľovej metódy môžeme zmerať načasovanie, zalogovať ju a vrátiť výslednú hodnotu metódy volajúcemu.

6. Prehľad

V tomto článku sme sa dozvedeli rôzne typy rád na jar a ich vyhlásenia a implementácie. Aspekty sme definovali pomocou prístupu založeného na schéme a pomocou anotácií AspectJ. Poskytli sme tiež niekoľko možných aplikácií na poradenstvo.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete v mojom projekte GitHub.


$config[zx-auto] not found$config[zx-overlay] not found