Introduktion til rådgivningstyper om foråret
1. Oversigt
I denne artikel vil vi diskutere forskellige typer AOP-råd, der kan oprettes om foråret.
Råd er en handling truffet af et aspekt på et bestemt sammenføjningspunkt. Forskellige typer rådgivning inkluderer "omkring", "før" og "efter" rådgivning. Hovedformålet med aspekter er at understøtte tværgående bekymringer, såsom logning, profilering, caching og transaktionsstyring.
Og hvis du vil gå dybere ind i punktformede udtryk, så tjek den forrige introduktion til disse.
2. Aktivering af rådgivning
Med Spring kan du erklære rådgivning ved hjælp af AspectJ-kommentarer, men du skal først anvende @EnableAspectJAutoProxy kommentar til din konfigurationsklasse, som muliggør understøttelse af håndtering af komponenter markeret med AspectJ's @Aspect kommentar.
@Configuration @EnableAspectJAutoProxy offentlig klasse AopConfiguration {...}
2.1. Spring Boot
I Spring Boot-projekter behøver vi ikke eksplicit at bruge @EnableAspectJAutoProxy. Der er en dedikeret AopAutoConfiguration der muliggør Spring's AOP support, hvis Aspekt eller Råd er på klassestien.
3. Før rådgivning
Dette råd, som navnet antyder, udføres før sammenføjningspunktet. Det forhindrer ikke den fortsatte udførelse af den metode, den rådgiver, medmindre en undtagelse kastes.
Overvej følgende aspekt, der blot logger metodens navn, før det kaldes:
@Komponent @Aspect offentlig klasse LoggingAspect {privat Logger-logger = Logger.getLogger (LoggingAspect.class.getName ()); @Pointcut ("@ target (org.springframework.stereotype.Repository)") offentlige ugyldige repositoryMethods () {}; @Before ("repositoryMethods ()") public void logMethodCall (JoinPoint jp) {String methodName = jp.getSignature (). GetName (); logger.info ("Før" + metodenavn); }}
Det logMethodCall rådgivning vil blive udført før enhver arkivmetode defineret af repositoryMethods genvejstast.
4. Efter rådgivning
Efter rådgivning, erklæret ved hjælp af @Efter annotation, udføres efter en matchet metodes udførelse, uanset om der blev kastet en undtagelse.
På nogle måder ligner det en langt om længe blok. Hvis du kun har brug for rådgivning, der skal udløses efter normal udførelse, skal du bruge tilbagevendende rådgivning erklæret af @AfterReturning kommentar. Hvis du kun ønsker, at dit råd udløses, når målmetoden giver en undtagelse, skal du bruge kaste råd, erklæret ved hjælp af @ Efterkastning kommentar.
Antag, at vi ønsker at underrette nogle applikationskomponenter, når en ny forekomst af Foo er oprettet. Vi kunne offentliggøre en begivenhed fra FooDao, men dette ville være i strid med princippet om et enkelt ansvar.
I stedet kan vi opnå dette ved at 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 (enhed)); }}
Bemærk først at ved hjælp af @AfterReturning kommentar, vi kan få adgang til målmetodens returværdi. For det andet ved at erklære en parameter af typen JoinPoint, vi kan få adgang til argumenterne for målmetodens påkaldelse.
Derefter opretter vi en lytter, der blot logger begivenheden:
@Komponent offentlig klasse FooCreationEventListener implementerer ApplicationListener {private Logger logger = Logger.getLogger (getClass (). GetName ()); @ Overstyr offentlig ugyldighed påApplicationEvent (FooCreationEvent-begivenhed) {logger.info ("Oprettet foo-instans:" + event.getSource (). ToString ()); }}
5. Omkring rådgivning
Omkring rådgivning omgiver et sammenføjningspunkt såsom en metodeopkald.
Dette er den mest magtfulde form for rådgivning. Omkring rådgivning kan udføre brugerdefineret adfærd både før og efter metodeopkald. Det er også ansvarligt for at vælge, om at gå videre til sammenføjningspunktet eller genveje den anbefalede metodeudførelse ved at give sin egen returværdi eller kaste en undtagelse.
Antag, at vi vil måle metodeudførelsestid for at demonstrere brugen heraf. Lad os oprette et aspekt for dette:
@Aspect @Component offentlig klasse PerformanceAspect {private Logger-logger = Logger.getLogger (getClass (). GetName ()); @Pointcut ("inden for (@ org.springframework.stereotype.Repository *)") offentligt tomrum repositoryClassMethods () {}; @Around ("repositoryClassMethods ()") public Object measureMethodExecutionTime (ProceedingJoinPoint pjp) throw Throwable {long start = System.nanoTime (); Objektretval = pjp.proceed (); lang ende = System.nanoTime (); String methodName = pjp.getSignature (). GetName (); logger.info ("Udførelse af" + methodName + "tog" + TimeUnit.NANOSECONDS.toMillis (slutstart) + "ms"); tilbagevenden }}
Dette råd udløses, når nogen af de sammenføjningspunkter, der matches med repositoryClassMethods genvej udføres.
Dette råd tager en parameter af typen FortsætterJointPoint. Parameteren giver os en mulighed for at handle inden målmetodeopkaldet. jegI dette tilfælde gemmer vi simpelthen metoden starttid.
For det andet er rådgivningstypen Objekt da målmetoden kan returnere et resultat af enhver type. Hvis målmetoden er ugyldig,nul vil blive returneret. Efter målmetodekaldet kan vi måle timingen, logge den og returnere metodens resultatværdi til den, der ringer op.
6. Oversigt
I denne artikel har vi lært de forskellige typer rådgivning i foråret og deres erklæringer og implementeringer. Vi definerede aspekter ved hjælp af skema-baseret tilgang og ved hjælp af AspectJ-kommentarer. Vi har også leveret flere mulige rådgivningsansøgninger.
Implementeringen af alle disse eksempler og kodestykker kan findes i mit GitHub-projekt.