Uvod u Pointcut izraze u proljeće

1. Pregled

U ovom uputstvu razgovarat ćemo o proljetnom AOP jeziku izraza točaka.

Prvo ćemo predstaviti neku terminologiju koja se koristi u programiranju usmjerenom na aspekte. A točka pridruživanja je korak izvršenja programa, kao što je izvršavanje metode ili rukovanje iznimkom. U proljetnom AOP-u točka spajanja uvijek predstavlja izvršavanje metode. A pointcut je predikat koji odgovara točkama spajanja i a pointcut izraz jezik je način programskog opisivanja točaka.

2. Upotreba

Točkasti izraz može se pojaviti kao vrijednost znaka @Pointcut napomena:

@Pointcut ("unutar (@ org.springframework.stereotype.Repository *)") javno void spremišteClassMethods () {}

Deklaracija metode naziva se pointcut potpis. Pruža ime koje se u napomenama savjeta može koristiti za upućivanje na taj pointcut.

@Around ("repositoryClassMethods ()") public Object measureMethodExecutionTime (ProceedingJoinPoint pjp) baca mogućnost bacanja {...}

Izraz točke izrezivanja mogao bi se pojaviti i kao vrijednost znaka izraz svojstvo an aop: pointcut označiti:

3. Pointcut Dizajneri

Pointcut izraz započinje s označivač točke (PCD), što je ključna riječ koja proljetnom AOP-u govori što treba podudarati. Postoji nekoliko označitelja pointcut-a, poput izvođenja metode, vrste, argumenata metode ili bilješki.

3.1 izvršenje

Primarni proljetni PCD je izvršenje, koji odgovara točkama spajanja izvršenja metode.

@Pointcut ("izvršenje (javni niz com.baeldung.pointcutadvice.dao.FooDao.findById (Long))")

Ovaj primjer pointcut točno će odgovarati izvršenju findById metoda FooDao razred. To djeluje, ali nije vrlo fleksibilno. Pretpostavimo da bismo željeli podudarati sve metode FooDao klase, koja može imati različite potpise, vrste povratka i argumente. Da bismo to postigli, možemo koristiti zamjenske znakove:

@Pointcut ("izvršenje (* com.baeldung.pointcutadvice.dao.FooDao. * (..))")

Ovdje se prvi zamjenski znak podudara s bilo kojom povratnom vrijednošću, drugi odgovara bilo kojem imenu metode i (..) uzorak odgovara bilo kojem broju parametara (nula ili više).

3.2 unutar

Drugi način postizanja istog rezultata iz prethodnog odjeljka je upotreba unutar PCD, koji ograničava podudaranje na spajanje točaka određenih vrsta.

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

Također bismo mogli podudarati bilo koju vrstu unutar com.baeldung paket ili podpaket.

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

3.3 ovaj i cilj

ovaj ograničava podudaranje za spajanje točaka u kojima je referenca graha instanca dane vrste, dok cilj ograničava podudaranje na spajanje točaka u kojima je ciljni objekt instanca zadanog tipa. Prvi radi kad Spring AOP stvori proxy zasnovan na CGLIB-u, a drugi se koristi kada se stvori proxy zasnovan na JDK-u. Pretpostavimo da ciljna klasa implementira sučelje:

javna klasa FooDao implementira BarDao {...}

U tom će slučaju Spring AOP koristiti proxy zasnovan na JDK, a vi biste trebali koristiti cilj PCD jer će proksirani objekt biti instanca Proxy razred i implementirati BarDao sučelje:

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

S druge strane ako FooDao ne implementira nijedno sučelje ili proxyTargetClass svojstvo je postavljeno na true, tada će proksirani objekt biti podrazred FooDao i ovaj PCD se može koristiti:

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

3.4 argumenata

Ovaj PCD koristi se za podudaranje određenih argumenata metode:

@Pointcut ("izvršenje (* * .. pronađi * (dugo))")

Ovaj se pointcut podudara s bilo kojom metodom koja započinje s findom i ima samo jedan parametar tipa Dugo. Ako želimo uskladiti metodu s bilo kojim brojem parametara, ali koji imaju prvi parametar tipa Dugo, mogli bismo upotrijebiti sljedeći izraz:

@Pointcut ("izvršenje (* * .. pronađi * (Long, ..))")

3.5 @cilj

The @cilj PCD (ne treba ga miješati sa cilj PCD (gore opisani) ograničava podudaranje na spajanje točaka u kojima klasa izvršnog objekta ima napomenu datog tipa:

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

3.6 @args

Ovaj PCD ograničava podudaranje na spajanje točaka u kojima vrsta izvođenja stvarnih prosljeđenih argumenata ima napomene zadane vrste (vrsta). Pretpostavimo da želimo ući u trag svim metodama koje prihvaćaju grah označen s @ Entitet napomena:

@Pointcut ("@ args (com.baeldung.pointcutadvice.annotations.Entity)") metode javne praznineAcceptingEntities () {}

Za pristup argumentu trebali bismo navesti a JoinPoint argument savjetu:

@Before ("methodsAcceptingEntities ()") public void logMethodAcceptionEntityAnnotatedBean (JoinPoint jp) {logger.info ("Prihvaćanje graha s oznakom @Entity:" + jp.getArgs () [0]); }

3.7 @unutar

Ovaj PCD ograničava podudaranje za spajanje točaka unutar tipova koji imaju zadanu napomenu:

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

Što je ekvivalentno:

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

3.8 @notacija

Ovaj PCD ograničava podudaranje na točke spajanja u kojima je predmet točke pridruživanja zadanu napomenu. Na primjer, možemo stvoriti @Prijava napomena:

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

Tada možemo zabilježiti izvršavanje metoda označenih tom napomenom:

@Before ("loggableMethods ()") public void logMethod (JoinPoint jp) {String methodName = jp.getSignature (). GetName (); logger.info ("Metoda izvršavanja:" + imeName); }

4. Kombiniranje Pointcut izraza

Izrazi pointcut mogu se kombinirati pomoću &&, || i ! operateri:

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

5. Zaključak

U ovom kratkom uvodu u Spring AOP i pointcuts, ilustrirali smo neke primjere korištenja pointcut izraza.

Cjelovit niz primjera možete pronaći na GitHubu.