Introduksjon til rådgivningstyper om våren

1. Oversikt

I denne artikkelen vil vi diskutere forskjellige typer AOP-råd som kan opprettes om våren.

Råd er en handling utført av et aspekt på et bestemt sammenføyningspunkt. Ulike typer råd inkluderer "rundt", "før" og "etter" råd. Hovedformålet med aspekter er å støtte tverrgående bekymringer, som logging, profilering, caching og transaksjonsadministrasjon.

Og hvis du vil gå dypere inn i snarveisuttrykk, sjekk ut forrige intro til disse.

2. Aktivere råd

Med Spring kan du erklære råd ved hjelp av AspectJ-merknader, men du må først bruke @EnableAspectJAutoProxy kommentar til konfigurasjonsklassen din, som vil muliggjøre støtte for håndtering av komponenter merket med AspectJ @Aspect kommentar.

@Configuration @EnableAspectJAutoProxy offentlig klasse AopConfiguration {...}

2.1. Vårstøvel

I Spring Boot-prosjekter trenger vi ikke å bruke eksplisitt @EnableAspectJAutoProxy. Det er en dedikert AopAutoConfiguration som muliggjør vårens AOP-støtte hvis Aspekt eller Råd er på klassestien.

3. Før råd

Dette rådet, som navnet antyder, blir utført før sammenkoblingspunktet. Det forhindrer ikke fortsatt utførelse av metoden den anbefaler, med mindre et unntak blir kastet.

Tenk på følgende aspekt som bare logger metodens navn før det heter:

@Component @Aspect public class LoggingAspect {private Logger logger = Logger.getLogger (LoggingAspect.class.getName ()); @Pointcut ("@ target (org.springframework.stereotype.Repository)") offentlig tomrom repositoryMethods () {}; @Before ("repositoryMethods ()") offentlig tomrom logMethodCall (JoinPoint jp) {String methodName = jp.getSignature (). GetName (); logger.info ("Before" + methodName); }}

De logMethodCall råd vil bli utført før noen depotmetode definert av repositoryMethods snarvei.

4. Etter rådgivning

Etter råd, erklært ved hjelp av @Etter kommentar, utføres etter kjøring av en matchet metode, uansett om det ble kastet et unntak eller ikke.

På noen måter ligner det på en endelig blokkere. Hvis du trenger råd som bare skal utløses etter normal utførelse, bør du bruke tilbake råd erklært av @AfterReturning kommentar. Hvis du vil at rådene dine bare skal utløses når målmetoden gir unntak, bør du bruke kasteråd, erklært ved å bruke @Etterkasting kommentar.

Anta at vi ønsker å varsle noen applikasjonskomponenter når en ny forekomst av Foo er skapt. Vi kunne publisere et arrangement fra FooDao, men dette ville bryte med prinsippet om enkeltansvar.

I stedet kan vi oppnå dette ved å definere følgende aspekt:

@Komponent @Aspect offentlig klasse PublishingAspect {privat ApplicationEventPublisher eventPublisher; @Autowired public void setEventPublisher (ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher; } @Pointcut ("@ target (org.springframework.stereotype.Repository)") public void repositoryMethods () {} @Pointcut ("execution (* * .. create * (Long, ..))") public void firstLongParamMethods ( ) {} @Pointcut ("repositoryMethods () && firstLongParamMethods ()") public void entityCreationMethods () {} @AfterReturning (value = "entityCreationMethods ()", return = "entity") public void logMethodCall (JoinPoint jp, Object entity) kaster Throwable {eventPublisher.publishEvent (ny FooCreationEvent (enhet)); }}

Legg merke til først at ved å bruke @AfterReturning kommentar vi kan få tilgang til målmetodens returverdi. For det andre ved å erklære en parameter av typen Bli medPoint, vi har tilgang til argumentene for målmetodens påkallelse.

Deretter oppretter vi en lytter som bare logger hendelsen:

@Komponent offentlig klasse FooCreationEventListener implementerer ApplicationListener {private Logger logger = Logger.getLogger (getClass (). GetName ()); @ Overstyr offentlig tomrom påApplicationEvent (FooCreationEvent-hendelse) {logger.info ("Opprettet foo-forekomst:" + event.getSource (). ToString ()); }}

5. Rundt råd

Rundt råd omgir et sammenkoblingspunkt som en metodeinnkallelse.

Dette er den mektigste rådet. Rundt om råd kan utføre tilpasset atferd både før og etter metodeanropet. Det er også ansvarlig for å velge om du vil gå videre til sammenføyningspunktet eller snarvei den anbefalte metodeutførelsen ved å gi sin egen returverdi eller kaste et unntak.

For å demonstrere bruken, anta at vi vil måle metodens utførelsestid. La oss lage et aspekt for dette:

@Aspect @Component offentlig klasse PerformanceAspect {private Logger logger = Logger.getLogger (getClass (). GetName ()); @Pointcut ("innenfor (@ org.springframework.stereotype.Repository *)") offentlig tomrom repositoryClassMethods () {}; @Around ("repositoryClassMethods ()") offentlig Object measureMethodExecutionTime (ProceedingJoinPoint pjp) kaster Kastbar {lang start = System.nanoTime (); Objektretval = pjp.proceed (); lang ende = System.nanoTime (); String methodName = pjp.getSignature (). GetName (); logger.info ("Utførelse av" + methodName + "tok" + TimeUnit.NANOSECONDS.toMillis (slutt - start) + "ms"); returretval; }}

Dette rådet utløses når noen av sammenkoblingspunktene matches av repositoryClassMethods punktkutt utføres.

Dette rådet tar en parameter av typen FortsetterJointPoint. Parameteren gir oss en mulighet til å iverksette tiltak før målmetodeanropet. JegI dette tilfellet sparer vi ganske enkelt metoden starttid.

For det andre er typen returret Gjenstand siden målmetoden kan returnere et resultat av hvilken som helst type. Hvis målmetoden er tomrom,null vil bli returnert. Etter målmetodeanropet kan vi måle timingen, logge den og returnere metodens resultatverdi til den som ringer.

6. Oversikt

I denne artikkelen har vi lært de forskjellige rådene om våren og deres erklæringer og implementeringer. Vi definerte aspekter ved hjelp av skjemabasert tilnærming og ved hjelp av AspectJ-merknader. Vi har også gitt flere mulige rådssøknader.

Implementeringen av alle disse eksemplene og kodebiter finner du i GitHub-prosjektet mitt.


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