Introduktion til Pointcut Expressions om foråret

1. Oversigt

I denne vejledning vil vi diskutere Spring AOP pointcut expression sprog.

Vi vil først introducere nogle terminologier, der bruges i aspektorienteret programmering. EN slutte sig til punktet er et trin i programudførelsen, såsom udførelse af en metode eller håndtering af en undtagelse. I Spring AOP repræsenterer et sammenføjningspunkt altid en metodeudførelse. EN genvejstast er et prædikat, der matcher sammenføjningspunkterne og a genvejssprog er en måde at beskrive punktgenveje på.

2. Anvendelse

Et genvejsudtryk kan vises som en værdi af @Pointcut kommentar:

@Pointcut ("inden for (@ org.springframework.stereotype.Repository *)") offentligt ugyldigt repositoryClassMethods () {}

Metodedeklarationen kaldes genvejssignatur. Det giver et navn, der kan bruges af rådgivningskommentarer til at henvise til den genvej.

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

Et genvejsudtryk kan også vises som værdien af udtryk ejendom af en aop: pointcut tag:

3. Pointcut-designatorer

Et punkt genvejsudtryk starter med en pointcut designator (PCD), som er et nøgleord, der fortæller Spring AOP, hvad der skal matches. Der er flere genvejstegnere, f.eks. Udførelse af en metode, en type, metodeargumenter eller annoteringer.

3.1 udførelse

Den primære fjeder-PCD er udførelse, der matcher metodekørselens sammenkoblingspunkter.

@Pointcut ("udførelse (offentlig streng com.baeldung.pointcutadvice.dao.FooDao.findById (lang))")

Dette eksempels genvej svarer nøjagtigt til udførelsen af findById metode til FooDao klasse. Dette fungerer, men det er ikke meget fleksibelt. Antag, at vi gerne vil matche alle metoderne til FooDao klasse, som kan have forskellige signaturer, returtyper og argumenter. For at opnå dette kan vi bruge jokertegn:

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

Her matcher det første jokertegn enhver returværdi, det andet matcher ethvert metodenavn og (..) mønster matcher et vilkårligt antal parametre (nul eller mere).

3.2 inden for

En anden måde at opnå det samme resultat fra det foregående afsnit er ved at bruge inden for PCD, som begrænser matchning til sammenkoblingspunkter af bestemte typer.

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

Vi kunne også matche enhver type inden for com.baeldung pakke eller en underpakke.

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

3.3 det her og mål

det her begrænser matchning til sammenføjningspunkter, hvor bønnehenvisningen er en forekomst af den givne type, mens mål begrænser matchning til sammenføjningspunkter, hvor målobjektet er en forekomst af den givne type. Førstnævnte fungerer, når Spring AOP opretter en CGLIB-baseret proxy, og sidstnævnte bruges, når der oprettes en JDK-baseret proxy. Antag, at målklassen implementerer en grænseflade:

offentlig klasse FooDao implementerer BarDao {...}

I dette tilfælde bruger Spring AOP den JDK-baserede proxy, og du skal bruge mål PCD, fordi det nærliggende objekt vil være en forekomst af Proxy klasse og implementere BarDao grænseflade:

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

På den anden side hvis FooDao implementerer ikke nogen grænseflade eller proxyTargetClass egenskab er indstillet til sand, så vil det nærliggende objekt være en underklasse af FooDao og det her PCD kunne bruges:

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

3.4 argumenterer

Denne PCD bruges til at matche bestemte metodeargumenter:

@Pointcut ("udførelse (* * .. find * (lang))")

Denne genvej matcher enhver metode, der starter med find og kun har en parameter af typen Lang. Hvis vi ønsker at matche en metode med et vilkårligt antal parametre, men med fist-parameteren af ​​typen Lang, kunne vi bruge følgende udtryk:

@Pointcut ("udførelse (* * .. find * (lang, ..))")

3.5 @mål

Det @mål PCD (ikke at forveksle med mål PCD beskrevet ovenfor) begrænser matchning til sammenføjningspunkter, hvor klassen for det udførende objekt har en kommentar af den givne type:

@Pointcut ("@ mål (org.springframework.stereotype.Repository)")

3.6 @args

Denne PCD begrænser matchning til sammenføjningspunkter, hvor runtime-typen af ​​de faktiske beståede argumenter har annoteringer af de givne typer. Antag, at vi vil spore alle de metoder, der accepterer bønner, der er kommenteret med @Enhed kommentar:

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

For at få adgang til argumentet skal vi angive en Deltag iPoint argument til rådet:

@Before ("methodAcceptingEntities ()") offentlig ugyldig logMethodAcceptionEntityAnnotatedBean (JoinPoint jp) {logger.info ("Accepterer bønner med @Entity-kommentar:" + jp.getArgs () [0]); }

3.7 @inden for

Denne PCD begrænser matchning til sammenføjningspunkter inden for typer, der har den givne kommentar:

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

Hvilket svarer til:

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

3.8 @annotation

Denne PCD begrænser matchning til sammenføjningspunkter, hvor emnet for sammenføjningspunktet har den givne kommentar. For eksempel kan vi oprette en @Loggable kommentar:

@Pointcut ("@ annotation (com.baeldung.pointcutadvice.annotations.Loggable)") offentlige ugyldige loggableMethods () {}

Derefter logger vi muligvis udførelsen af ​​de metoder, der er markeret med denne kommentar:

@Before ("loggableMethods ()") public void logMethod (JoinPoint jp) {String methodName = jp.getSignature (). GetName (); logger.info ("Udførelsesmetode:" + methodName); }

4. Kombination af Pointcut Expressions

Pointcut-udtryk kan kombineres ved hjælp af &&, || og ! operatører:

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

5. Konklusion

I denne hurtige introduktion til Spring AOP og pointcuts illustrerede vi nogle eksempler på brug af pointcut-udtryk.

Det fulde sæt af eksempler kan findes på GitHub.