Bevezetés a Pointcut kifejezésekbe tavasszal

1. Áttekintés

Ebben az oktatóanyagban megvitatjuk a Spring AOP pointcut kifejezés nyelvét.

Először bemutatunk néhány szempont-orientált programozásban használt terminológiát. A csatlakozási pont a program végrehajtásának egy lépése, például egy módszer végrehajtása vagy egy kivétel kezelése. A tavaszi AOP-ban a csatlakozási pont mindig a módszer végrehajtását jelenti. A pointcut olyan állítmány, amely illeszkedik a csatlakozási pontokhoz és a pointcut kifejezés nyelve a pontok programozott leírásának egyik módja.

2. Használat

A pointcut kifejezés a. Értékeként jelenhet meg @Pointcut kommentár:

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

A metódus deklarációt nevezzük pointcut aláírás. Olyan nevet ad meg, amelyet a tanács annotációk használhatnak az adott pontra való hivatkozásra.

@Around ("repositoryClassMethods ()") public Object measureMethodExecutionTime (ProceedingJoinPoint pjp) dobható dobás {...}

A pointcut kifejezés is megjelenhet a kifejezés tulajdona egy aop: pointcut címke:

3. Pontjelzők

A pointcut kifejezés a-val kezdődik pointcut kijelölő (PCD), ami egy kulcsszó, amely megmondja a Spring AOP-nak, hogy mihez illeszkedjen. Számos pointcut-jelölő létezik, például egy metódus, egy típus, egy metódus argumentum vagy kommentár végrehajtása.

3.1 végrehajtás

Az elsődleges tavaszi PCD végrehajtás, amely megegyezik a metódus végrehajtásának csatlakozási pontjaival.

@Pointcut ("végrehajtás (nyilvános karakterlánc com.baeldung.pointcutadvice.dao.FooDao.findById (hosszú))")

Ez a példa pointcut pontosan meg fog egyezni a végrehajtásával findById módszere FooDao osztály. Ez működik, de nem túl rugalmas. Tegyük fel, hogy szeretnénk egyeztetni a FooDao osztály, amelynek lehetnek különböző aláírásai, visszatérési típusai és argumentumai. Ennek érdekében helyettesítő karaktereket használhatunk:

@Pointcut ("végrehajtás (* com.baeldung.pointcutadvice.dao.FooDao. * (..))")

Itt az első helyettesítő karakter megfelel a visszatérési értékeknek, a második a metódus nevének és a (..) minta tetszőleges számú paraméternek felel meg (nulla vagy több).

3.2 belül

Az előző szakaszból eredő eredmény elérésének másik módja a belül PCD, amely korlátozza az illesztést bizonyos típusú pontok összekapcsolásához.

@Pointcut ("belül (com.baeldung.pointcutadvice.dao.FooDao)")

Bármilyen típust is meg tudunk felelni a com.baeldung csomag vagy alcsomag.

@Pointcut ("belül (com.baeldung .. *)")

3.3 ez és cél

ez korlátozza az illesztést azokhoz a pontokhoz, ahol a bab referencia az adott típusú példány, míg a cél korlátozza az illesztést azokhoz a pontokhoz, ahol a célobjektum az adott típusú példány. Az előbbi akkor működik, amikor a Spring AOP CGLIB alapú proxyt hoz létre, az utóbbit pedig JDK alapú proxy létrehozásakor. Tegyük fel, hogy a célosztály megvalósít egy interfészt:

a FooDao nyilvános osztály végrehajtja a BarDao-t {...}

Ebben az esetben a Spring AOP a JDK-alapú proxyt használja, és Önnek a cél PCD, mert a proxy objektum a Meghatalmazott osztály és végrehajtja a BarDao felület:

@Pointcut ("target (com.baeldung.pointcutadvice.dao.BarDao)")

Másrészt ha FooDao nem valósít meg semmilyen interfészt vagy proxyTargetClass tulajdonság értéke true, akkor a proxyként használt objektum a FooDao és a ez PCD alkalmazható:

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

3.4 érvel

Ezt a PCD-t használják a metódusok argumentumainak megfeleltetésére:

@Pointcut ("végrehajtás (* * .. keresés * (hosszú))")

Ez a pontvonás megfelel minden olyan módszernek, amely a kereséssel kezdődik, és csak egy típusú paramétert tartalmaz Hosszú. Ha egy metódust tetszőleges számú paraméterrel akarunk összehangolni, de az első paraméter típusú Hosszú, használhatnánk a következő kifejezést:

@Pointcut ("végrehajtás (* * .. find * (Long, ..))")

3.5 @cél

A @cél PCD (nem tévesztendő össze a cél A fent leírt PCD) korlátozza az illesztést azokhoz a pontokhoz, ahol a végrehajtó objektum osztálya rendelkezik a megadott típusú kommentárral:

@Pointcut ("@ target (org.springframework.stereotype.Repository)")

3.6 @args

Ez a PCD korlátozza az illesztést azokhoz a pontokhoz, ahol a tényleges átadott argumentumok futási idejének típusai tartalmazzák az adott típusú feliratokat. Tegyük fel, hogy szeretnénk nyomon követni az összes olyan módszert, amellyel a babot bejegyeztük @Entity kommentár:

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

Az érv eléréséhez meg kell adnunk a JoinPoint érv a tanácsra:

@Before ("methodAcceptingEntities ()") public void logMethodAcceptionEntityAnnotatedBean (JoinPoint jp) {logger.info ("Babok elfogadása @Entity annotációval:" + jp.getArgs () [0]); }

3.7 @belül

Ez a PCD korlátozza az egyezés pontokhoz való csatlakozását a megadott jegyzettel rendelkező típusokon belül:

@Pointcut ("@ belül (org.springframework.stereotype.Repository)")

Ami egyenértékű:

@Pointcut ("belül (@ org.springframework.stereotype.Repository *)")

3.8 @jegyzet

Ez a PCD korlátozza az illesztést azokhoz a csatlakozási pontokhoz, ahol a csatlakozási pont alanya rendelkezik a megadott kommentárral. Például létrehozhatunk egy @Loggable kommentár:

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

Ezután naplózhatjuk az annotációval megjelölt módszerek végrehajtását:

@Before ("loggableMethods ()") public void logMethod (JoinPoint jp) {String methodName = jp.getSignature (). GetName (); logger.info ("Végrehajtó módszer:" + metódusnév); }

4. Pointcut kifejezések kombinálása

A pointcut kifejezéseket kombinálhatjuk &&, || és ! üzemeltetők:

@Pointcut ("@ target (org.springframework.stereotype.Repository)") public void repositoryMethods () {} @Pointcut ("végrehajtás (* * .. create * (Long, ..))") public void firstLongParamMethods () {} @Pointcut ("repositoryMethods () && firstLongParamMethods ()") public void entitásCreationMethods () {}

5. Következtetés

A Spring AOP és a pointcuts gyors bemutatásában néhány példát mutatunk be a pointcut kifejezések használatára.

A teljes példakészlet megtalálható a GitHub oldalon.


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