Úvod do výrazov pointcut na jar

1. Prehľad

V tomto výučbe sa budeme zaoberať jazykovým výrazom Spring AOP pointcut.

Najskôr si predstavíme terminológiu používanú v aspektovo orientovanom programovaní. A spojiť bod je krok vykonania programu, napríklad vykonanie metódy alebo spracovanie výnimky. Na jar AOP predstavuje spojovací bod vždy vykonanie metódy. A pointcut je predikát, ktorý sa zhoduje so spojovacími bodmi a bodový výrazový jazyk je spôsob programového popisu bodových rezov.

2. Použitie

Bodový výraz sa môže javiť ako hodnota parametra @Pointcut anotácia:

@Pointcut ("within (@ org.springframework.stereotype.Repository *)") public void repositoryClassMethods () {}

Deklarácia metódy sa nazýva bodový podpis. Poskytuje názov, ktorým sa anotácie rád môžu odkazovať na tento bodový bod.

@Around ("repositoryClassMethods ()") public Object measureMethodExecutionTime (ProceedingJoinPoint pjp) hodí Throwable {...}

Bodový výraz sa môže zobraziť aj ako hodnota výraz majetok aop: pointcut značka:

3. Označovač bodov

Bodový výraz začína na označovač pointcut (PCD), čo je kľúčové slovo, ktoré hovorí Spring AOP, čo sa má zhodovať. Existuje niekoľko označení pointcut, ako napríklad vykonanie metódy, typu, argumentov metódy alebo anotácií.

3.1 exekúcia

Primárna pružina PCD je exekúcia, ktorý sa zhoduje so spojením vykonávacích metód.

@Pointcut ("prevedenie (verejný reťazec com.baeldung.pointcutadvice.dao.FooDao.findById (dlhý))")

Tento ukážkový bod bude presne zodpovedať vykonaniu súboru findById metóda FooDao trieda. To funguje, ale nie je to veľmi flexibilné. Predpokladajme, že by sme chceli vyhovieť všetkým metódam FooDao trieda, ktorá môže mať rôzne podpisy, návratové typy a argumenty. Aby sme to dosiahli, môžeme použiť zástupné znaky:

@Pointcut ("prevedenie (* com.baeldung.pointcutadvice.dao.FooDao. * (..))")

Tu sa prvý zástupný znak zhoduje s akoukoľvek návratovou hodnotou, druhý sa zhoduje s akýmkoľvek názvom metódy a znakom (..) vzor zodpovedá ľubovoľnému počtu parametrov (nula alebo viac).

3.2 v rámci

Ďalším spôsobom, ako dosiahnuť rovnaký výsledok z predchádzajúcej časti, je použitie v rámci PCD, ktorý obmedzuje priraďovanie k spojovacím bodom určitých typov.

@Pointcut ("within (com.baeldung.pointcutadvice.dao.FooDao)")

Tiež by sme mohli priradiť akýkoľvek typ v rámci com.baeldung balíček alebo čiastkový balík.

@Pointcut ("within (com.baeldung .. *)")

3.3 toto a cieľ

toto obmedzuje zhodu pri spájaní bodov, kde je odkazom na fazuľa inštancia daného typu, zatiaľ čo cieľ obmedzuje zhodu pri spájaní bodov, kde je cieľovým objektom inštancia daného typu. Prvý funguje, keď Spring AOP vytvorí proxy založený na CGLIB, a druhý sa použije, keď sa vytvorí proxy založený na JDK. Predpokladajme, že cieľová trieda implementuje rozhranie:

verejná trieda FooDao implementuje BarDao {...}

V takom prípade použije Spring AOP proxy založený na JDK a mali by ste použiť cieľ PCD, pretože proxy objekt bude inštanciou Proxy triedy a implementovať BarDao rozhranie:

@Pointcut („cieľ (com.baeldung.pointcutadvice.dao.BarDao)“)

Na druhej strane ak FooDao neimplementuje žiadne rozhranie alebo proxyTargetClass property je nastavená na true, potom bude proxy objekt podtriedou FooDao a toto Môže sa použiť PCD:

@Pointcut ("toto (com.baeldung.pointcutadvice.dao.FooDao)")

3.4 args

Toto PCD sa používa na priraďovanie argumentov konkrétnej metódy:

@Pointcut ("prevedenie (* * .. nájsť * (dlhé))")

Tento bodový bod zodpovedá akejkoľvek metóde, ktorá začína hľadaním, a má iba jeden parameter typu Dlhé. Ak chceme priradiť metódu k ľubovoľnému počtu parametrov, ale ktorá má prvý parameter typu Dlhé, môžeme použiť nasledujúci výraz:

@Pointcut ("prevedenie (* * .. nájsť * (dlhé, ..))")

3.5 @cieľ

The @cieľ PCD (nezamieňať s cieľ Vyššie popísaný PCD) obmedzuje zhodu na spojovacie body, kde má trieda vykonávajúceho objektu anotáciu daného typu:

@Pointcut ("@ cieľ (org.springframework.stereotype.Repository)")

3.6 @args

Toto PCD obmedzuje zhodu so spojovacími bodmi, kde runtime typ skutočných odovzdaných argumentov obsahuje anotácie daného typu (typov). Predpokladajme, že chceme vystopovať všetky metódy prijímajúce fazuľa s poznámkami @Entity anotácia:

@Pointcut ("@ args (com.baeldung.pointcutadvice.annotations.Entity)") public void methodsAcceptingEntities () {}

Pre prístup k argumentu by sme mali poskytnúť a JoinPoint argument k rade:

@Before ("methodsAcceptingEntities ()") public void logMethodAcceptionEntityAnnotatedBean (JoinPoint jp) {logger.info ("Prijímanie fazúľ s anotáciou @Entity:" + jp.getArgs () [0]); }

3.7 @v priebehu

Toto PCD obmedzuje zhody na spojenie miest v rámci typov, ktoré majú danú anotáciu:

@Pointcut ("@ v rámci (org.springframework.stereotype.Repository)")

Čo sa rovná:

@Pointcut ("within (@ org.springframework.stereotype.Repository *)")

3.8 @ anotácia

Toto PCD obmedzuje zhodu so spojovacími bodmi, kde má predmet spojovacieho bodu danú anotáciu. Môžeme napríklad vytvoriť a @ Prihlásiteľné anotácia:

@Pointcut ("@ annotation (com.baeldung.pointcutadvice.annotations.Loggable)") public void loggableMethods () {}

Potom môžeme zaznamenať vykonávanie metód označených touto anotáciou:

@Before ("loggableMethods ()") public void logMethod (JoinPoint jp) {String methodName = jp.getSignature (). GetName (); logger.info ("Vykonávacia metóda:" + methodName); }

4. Kombinácia výrazov pointcut

Bodové výrazy je možné kombinovať pomocou &&, || a ! operátori:

@Pointcut ("@ target (org.springframework.stereotype.Repository)") public void repositoryMethods () {} @Pointcut ("execution (* * .. create * (Long, ..))") public void firstLongParamMethods () {} @Pointcut ("repositoryMethods () && firstLongParamMethods ()") public void entityCreationMethods () {}

5. Záver

V tomto rýchlom úvode k jarným AOP a bodovým rezom sme ilustrovali niektoré príklady použitia výrazov bodových značiek.

Celý súbor príkladov nájdete na GitHub.