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.