Uvod u vrste savjeta u proljeće

1. Pregled

U ovom ćemo članku razgovarati o različitim vrstama AOP savjeta koji se mogu stvoriti u proljeće.

Savjet je radnja koju poduzima aspekt na određenoj točki spajanja. Različite vrste savjeta uključuju savjete "oko", "prije" i "poslije". Glavna svrha aspekata je pružanje podrške međusektorskim problemima, kao što su bilježenje, profiliranje, predmemoriranje i upravljanje transakcijama.

A ako želite ući dublje u pointcut izraze, pogledajte prethodni uvod u njih.

2. Omogućavanje savjeta

S Springom možete izjaviti savjet koristeći napomene AspectJ, ali prvo morate primijeniti @EnableAspectJAutoProxy napomena za vašu konfiguracijsku klasu, koji će omogućiti podršku za rukovanje komponentama označenim AspectJ-ima @Aspekt bilješka.

@Configuration @EnableAspectJAutoProxy javna klasa AopConfiguration {...}

2.1. Proljetni čizme

U projektima Spring Boot ne moramo eksplicitno koristiti @EnableAspectJAutoProxy. Postoji namjenski AopAutoConfiguration koji omogućuje Springovu AOP podršku ako Aspekt ili Savjet je na stazi.

3. Prije savjeta

Ovaj se savjet, kao što i samo ime kaže, izvršava prije točke spajanja. Ne sprječava daljnje izvršavanje metode koju savjetuje, osim ako se ne izuzme izuzetak.

Razmotrite sljedeći aspekt koji jednostavno bilježi ime metode prije nego što je pozvano:

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

The logMethodCall savjet će se izvršiti prije bilo koje metode spremišta definirane repozitorijMetode pointcut.

4. Nakon savjeta

Nakon savjeta, objavljenog pomoću @Nakon napomena, izvršava se nakon izvršenja podudarne metode, bez obzira je li izuzetak izbačen ili ne.

Na neki je način sličan a konačno blok. U slučaju da vam treba savjet koji će se pokrenuti tek nakon normalnog izvršavanja, trebali biste koristiti uzvratni savjet proglasio @AfterReturning bilješka. Ako želite da se vaš savjet pokreće samo kada ciljna metoda dobaci iznimku, trebali biste to koristiti dobacivanje savjet, deklariran pomoću @AfterThrowing bilješka.

Pretpostavimo da želimo obavijestiti neke komponente aplikacije kada se pojavi nova instanca Foo je stvorena. Mogli bismo objaviti događaj iz FooDao, ali to bi kršilo načelo jedinstvene odgovornosti.

Umjesto toga, to možemo postići definiranjem sljedećeg aspekta:

@Component @Aspect javna klasa PublishingAspect {private ApplicationEventPublisher eventPublisher; @Autowired javna praznina setEventPublisher (ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher; } @Pointcut ("@ target (org.springframework.stereotype.Repository)") javna void repositoryMethods () {} @Pointcut ("izvršenje (* * .. stvaranje * (Long, ..))") javna void firstLongParamMethods ( ) {} @Pointcut ("repositoryMethods () && firstLongParamMethods ()") javna void entityCreationMethods () {} @AfterReturning (value = "entityCreationMethods ()", return = "entity") javna void logMethodCall (JoinPoint jp, Object entity) baca Throwable {eventPublisher.publishEvent (novi FooCreationEvent (entitet)); }}

Prvo primijetite da pomoću @AfterReturniranje napomena možemo pristupiti povratnoj vrijednosti ciljne metode. Drugo, deklariranjem parametra tipa JoinPoint, možemo pristupiti argumentima pozivanja ciljne metode.

Dalje kreiramo slušatelj koji će jednostavno prijaviti događaj:

@Component javna klasa FooCreationEventListener implementira ApplicationListener {private Logger logger = Logger.getLogger (getClass (). GetName ()); @Override public void onApplicationEvent (FooCreationEvent event) {logger.info ("Created foo instance:" + event.getSource (). ToString ()); }}

5. Oko savjeta

Oko savjeta okružuje točku spajanja kao što je pozivanje metode.

Ovo je najsnažniji savjet. Oko savjet može izvršavati prilagođeno ponašanje i prije i nakon pozivanja metode. Također je odgovoran za odabir hoće li nastaviti do točke spajanja ili prečac do izvođenja savjetovane metode davanjem vlastite povratne vrijednosti ili izbacivanjem iznimke.

Da bismo demonstrirali njegovu upotrebu, pretpostavimo da želimo mjeriti vrijeme izvršavanja metode. Stvorimo aspekt za ovo:

@Aspect @Component javna klasa PerformanceAspect {private Logger logger = Logger.getLogger (getClass (). GetName ()); @Pointcut ("unutar (@ org.springframework.stereotype.Repository *)") javno void spremišteClassMethods () {}; @Around ("repositoryClassMethods ()") public Object measureMethodExecutionTime (ProceedingJoinPoint pjp) baca bacanje {long start = System.nanoTime (); Povlačenje objekta = pjp.proceed (); dugi kraj = System.nanoTime (); Metoda niza = pjp.getSignature (). GetName (); logger.info ("Izvršenje" + methodName + "uzelo je" + TimeUnit.NANOSECONDS.toMillis (kraj - početak) + "ms"); povrat retval; }}

Ovaj se savjet pokreće kada se bilo koja od točaka spajanja podudara s repositoryClassMethods izvršava se pointcut.

Ovaj savjet uzima jedan parametar tipa ProceedingJointPoint. Parametar nam daje priliku za akciju prije poziva ciljne metode. JaU ovom slučaju jednostavno štedimo vrijeme početka metode.

Drugo, tip povrata savjeta je Objekt budući da ciljana metoda može vratiti rezultat bilo koje vrste. Ako je ciljana metoda poništiti,null bit će vraćen. Nakon poziva ciljne metode možemo izmjeriti vrijeme, zabilježiti ga i vratiti vrijednost rezultata metode pozivatelju.

6. Pregled

U ovom smo članku naučili različite vrste savjeta u proljeće i njihove izjave i provedbe. Definirali smo aspekte primjenom pristupa temeljenog na shemi i korištenjem napomena AspectJ. Također smo pružili nekoliko mogućih aplikacija za savjete.

Implementacija svih ovih primjera i isječaka koda mogu se naći u mom GitHub projektu.


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