Introduktion til Spring AOP

1. Introduktion

I denne vejledning introducerer vi AOP (Aspect Oriented Programming) med Spring og begynder at forstå, hvordan vi kan begynde at bruge dette kraftfulde værktøj i praktiske scenarier.

Det er også muligt at udnytte AspectJs bemærkninger, når man udvikler ved hjælp af Spring AOP, men i denne artikel fokuserer vi på den centrale Spring AOP XML-baserede konfiguration.

2. Oversigt

AOP er et programmeringsparadigme, der sigter mod at øge modulariteten ved at tillade adskillelse af tværgående bekymringer. Det gør det ved at tilføje yderligere adfærd til eksisterende kode uden at ændre selve koden.

I stedet kan vi erklære denne nye kode og disse nye adfærd separat.

Forårs AOP-ramme hjælper os med at gennemføre disse tværgående bekymringer.

3. Maven-afhængigheder

Lad os starte med at tilføje Spring's AOP-biblioteksafhængighed i pom.xml:

 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE org.springframework.boot spring-boot-starter-aop 

Den seneste version af afhængigheden kan kontrolleres her.

4. AOP-koncepter og terminologi

Lad os kort gennemgå de begreber og terminologi, der er specifikke for AOP:

4.1. Forretningsobjekt

Et forretningsobjekt er en normal klasse, der har en normal forretningslogik. Lad os se på et enkelt eksempel på et forretningsobjekt, hvor vi bare tilføjer to tal:

public class SampleAdder {public int add (int a, int b) {return a + b; }} 

Bemærk, at denne klasse er en normal klasse med forretningslogik og uden forårsrelaterede kommentarer.

4.2. Aspekt

Et aspekt er en modulering af en bekymring, der skærer på tværs af flere klasser. Enhedslogning kan være et eksempel på en sådan tværgående bekymring.

Lad os se, hvordan vi definerer et simpelt aspekt:

offentlig klasse AdderAfterReturnAspect {private Logger logger = LoggerFactory.getLogger (this.getClass ()); offentlig ugyldighed efterReturn (Object returnValue) kaster Throwable {logger.info ("value return was {}", returnValue); }} 

I eksemplet ovenfor har vi lige defineret en simpel Java-klasse, der har en metode kaldet efterReturn der tager et argument af typen Objekt og det logger bare på den værdi. Bemærk, at selv vores AdderAfterReturnAspect er en standardklasse, fri for forårskommentarer.

I de næste sektioner vil vi se, hvordan vi kan tilslutte dette aspekt til vores forretningsobjekt.

4.3. Joinpoint

EN Joinpoint er et punkt under udførelsen af ​​et program, såsom udførelse af en metode eller håndtering af en undtagelse.

I foråret AOP, a Deltag iPoint repræsenterer altid en metodeudførelse.

4.4. Pointcut

En punktvej er et prædikat, der hjælper med at matche en Råd skal anvendes af en Aspekt på en bestemt Deltag iPoint.

Rådgivningen er ofte forbundet med en Pointcut udtryk og kører til enhver Joinpoint matchet af Pointcut.

4.5. Råd

Et råd er en handling, der udføres af et aspekt på et bestemt Joinpoint. Forskellige typer rådgivning inkluderer "Rundt", "før" og "efter" råd.

I foråret, en Råd er modelleret som en interceptor, der opretholder en kæde af interceptors omkring Joinpoint.

4.6. Ledningsføring af forretningsobjekt og aspekt

Lad os se på, hvordan vi kan binde et forretningsobjekt til et aspekt med et råd efter efterfølgende returnering.

Nedenfor er konfigurationsuddraget, som vi placerer i en standard Spring-konfiguration i “” tag:

Som det kan ses, har vi defineret en simpel bønne kaldet simpleAdder som repræsenterer en forekomst af et forretningsobjekt. Derudover opretter vi en forekomst af et Aspect kaldet AdderAfterReturnAspect.

XML er selvfølgelig ikke vores eneste mulighed her; som nævnt tidligere understøttes AspectJ-annoteringer også fuldt ud.

4.7. Konfiguration i overblik

Tag aop: config bruges til at definere AOP-relateret konfiguration. Indenfor config tag definerer vi den klasse, der repræsenterer et aspekt. Vi har givet det en henvisning til “DoAfterReturningAspect” aspekt bønne, som vi skabte.

Dernæst definerer vi en Pointcut ved hjælp af genvejstast tag. Punktgenvej brugt i eksemplet ovenfor er udførelse (* org.baeldung.logger.SampleAdder +. * (..)) hvilket betyder at anvende en rådgivning om enhver metode inden for SampleAdder klasse, der accepterer et vilkårligt antal argumenter og returnerer enhver værditype.

Dernæst definerer vi, hvilken rådgivning vi vil anvende. I ovenstående eksempel vil vi anvende rådgivning efter returnering, der er defineret i vores aspekt AdderAfterReturnAspect ved at udføre metoden navngivet efterReturn defineret ved hjælp af attributmetode.

Dette råd inden for Aspect tager en parameter af typen Objekt. Parameteren giver os en mulighed for at tage en handling før og / eller efter målmetodekaldet. I dette tilfælde logger vi bare metodens returværdi.

Spring AOP understøtter flere råd ved hjælp af annoteringsbaseret konfiguration - dette og flere eksempler kan findes her og her.

5. Konklusion

I denne vejledning illustrerede vi koncepter, der blev brugt i AOP og et eksempel på brug af AOP-modulet fra Spring. Hvis du er interesseret i at finde ud af mere om AOP, er der nogle ressourcer:

  • En introduktion til AspectJ
  • Implementering af en brugerdefineret foråret AOP-kommentar
  • En introduktion til Pointcut Expressions om foråret
  • Sammenligning af Spring AOP og AspectJ
  • En introduktion til rådgivningstyper om foråret

Implementeringen af ​​disse eksempler findes i GitHub-projektet - dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.