Introduksjon til Pointcut Expressions om våren

1. Oversikt

I denne opplæringen vil vi diskutere Spring AOP pointcut expression language.

Vi vil først introdusere noen terminologi som brukes i aspektorientert programmering. EN bli med på punktet er et trinn i programgjennomføringen, for eksempel utførelse av en metode eller håndtering av et unntak. I vår AOP representerer et sammenkoblingspunkt alltid en metodeutførelse. EN snarvei er et predikat som samsvarer med sammenføyningspunktene og a punktuttrykk uttrykk språk er en måte å beskrive snarveier programmatisk på.

2. Bruk

Et snarveisuttrykk kan vises som en verdi av @Pointcut kommentar:

@Pointcut ("innenfor (@ org.springframework.stereotype.Repository *)") offentlig tomrom repositoryClassMethods () {}

Metodedeklarasjonen kalles snarveissignatur. Det gir et navn som kan brukes av rådkommentarer for å referere til det snarveien.

@Around ("repositoryClassMethods ()") offentlig Object measureMethodExecutionTime (ProceedingJoinPoint pjp) kaster kastbar {...}

Et snarveisuttrykk kan også vises som verdien av uttrykk eiendommen til en aop: snarvei stikkord:

3. Pointcut Designators

Et snarveisuttrykk starter med en pointcut designator (PCD), som er et nøkkelord som forteller Spring AOP hva de skal matche. Det er flere snarveisbetegnere, for eksempel utførelse av en metode, en type, metodeargumenter eller merknader.

3.1 henrettelse

Den primære vår-PCD er henrettelse, som samsvarer med tilknytningspunkter for metodeutføring

@Pointcut ("utførelse (offentlig String com.baeldung.pointcutadvice.dao.FooDao.findById (Long))")

Dette eksemplet med snarvei samsvarer nøyaktig med utførelsen av findById metoden for FooDao klasse. Dette fungerer, men det er ikke veldig fleksibelt. Anta at vi vil matche alle metodene i FooDao klasse, som kan ha forskjellige signaturer, returtyper og argumenter. For å oppnå dette kan vi bruke jokertegn:

@Pointcut ("utførelse (* com.baeldung.pointcutadvice.dao.FooDao. * (..))")

Her samsvarer det første jokertegnet med en returverdi, det andre samsvarer med ethvert metodenavn og (..) mønster samsvarer med et hvilket som helst antall parametere (null eller mer).

3.2 innenfor

En annen måte å oppnå det samme resultatet fra forrige avsnitt er å bruke innenfor PCD, som begrenser matching til sammenkoblingspunkter av visse typer.

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

Vi kan også matche alle typer innen com.baeldung pakke eller en underpakke.

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

3.3 dette og mål

dette begrenser samsvar til sammenføyningspunkter der bønnereferansen er en forekomst av den gitte typen, mens mål begrenser samsvar til sammenkoblingspunkter der målobjektet er en forekomst av den gitte typen. Førstnevnte fungerer når Spring AOP oppretter en CGLIB-basert proxy, og sistnevnte brukes når en JDK-basert proxy opprettes. Anta at målklassen implementerer et grensesnitt:

offentlig klasse FooDao implementerer BarDao {...}

I dette tilfellet vil Spring AOP bruke den JDK-baserte proxyen, og du bør bruke mål PCD fordi det nærliggende objektet vil være en forekomst av Fullmektig klasse og implementere BarDao grensesnitt:

@Pointcut ("mål (com.baeldung.pointcutadvice.dao.BarDao)")

På den annen side hvis FooDao implementerer ikke noe grensesnitt eller proxyTargetClass egenskapen er satt til sann, så vil det nærliggende objektet være en underklasse av FooDao og dette PCD kan brukes:

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

3.4 argumenterer

Denne PCD brukes til å matche spesifikke metodeargumenter:

@Pointcut ("utførelse (* * .. finn * (lang))")

Denne snarveien samsvarer med en hvilken som helst metode som starter med finne og bare har én parameter av typen Lang. Hvis vi ønsker å matche en metode med et hvilket som helst antall parametere, men med nevneparameteren av typen Lang, kunne vi bruke følgende uttrykk:

@Pointcut ("utførelse (* * .. finn * (lang, ..))")

3.5 @mål

De @mål PCD (ikke forveksles med mål PCD beskrevet ovenfor) begrenser samsvar med sammenføyningspunkter der klassen til det utførende objektet har en kommentar av den gitte typen:

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

3.6 @args

Denne PCD-en begrenser samsvar med sammenføyningspunkter der kjøretidstypen til de faktiske argumentene som er sendt har merknader av den eller de gitte typene. Anta at vi vil spore alle metodene for å godta bønner som er merket med @Enhet kommentar:

@Pointcut ("@ args (com.baeldung.pointcutadvice.annotations.Entity)") offentlige ugyldighetsmetoderAcceptingEntities () {}

For å få tilgang til argumentet, bør vi oppgi en Bli med iPoint argument til rådet:

@Before ("methodsAcceptingEntities ()") public void logMethodAcceptionEntityAnnotatedBean (JoinPoint jp) {logger.info ("Godta bønner med @Entity-kommentar:" + jp.getArgs () [0]); }

3.7 @innenfor

Denne PCD-en begrenser samsvar for å bli med i poeng innenfor typer som har gitt kommentar:

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

Som tilsvarer:

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

3.8 @annotasjon

Denne PCD begrenser samsvar med sammenkoblingspunkter der emnet for sammenkoblingspunktet har gitt kommentar. For eksempel kan vi lage en @Loggable kommentar:

@Pointcut ("@ annotation (com.baeldung.pointcutadvice.annotations.Loggable)") offentlig ugyldig loggableMethods () {}

Så kan vi logge utføring av metodene som er merket med den kommentaren:

@Before ("loggableMethods ()") offentlig ugyldig logMethod (JoinPoint jp) {String methodName = jp.getSignature (). GetName (); logger.info ("Utføringsmetode:" + methodName); }

4. Kombinere Pointcut Expressions

Punktuttrykk kan kombineres ved hjelp av &&, || og ! operatører:

@Pointcut ("@ target (org.springframework.stereotype.Repository)") public void repositoryMethods () {} @Pointcut ("executing (* * .. create * (Long, ..))") public void firstLongParamMethods () {} @Pointcut ("repositoryMethods () && firstLongParamMethods ()") offentlig ugyldig enhetCreationMethods () {}

5. Konklusjon

I denne raske introen til Spring AOP og pointcuts illustrerte vi noen eksempler på bruk av punktuttrykk.

Hele settet med eksempler finner du på GitHub.


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