Implementacija prilagođene proljetne AOP bilješke

1. Uvod

U ovom ćemo članku implementirati prilagođenu AOP bilješku pomoću AOP podrške na proljeće.

Prvo ćemo dati pregled AOP-a na visokoj razini, objašnjavajući što je to i njegove prednosti. Nakon toga, korak po korak implementirat ćemo naše napomene, postupno gradeći sve dublje razumijevanje AOP koncepata kako idemo.

Ishod će biti bolje razumijevanje AOP-a i sposobnost stvaranja naših prilagođenih proljetnih bilješki u budućnosti.

2. Što je AOP napomena?

Da brzo rezimiramo, AOP je kratica za aspektno orijentirano programiranje. U srži, to je način za dodavanje ponašanja postojećem kodu bez modificiranja tog koda.

Za detaljan uvod u AOP postoje članci o AOP točkama i savjetima. Ovaj članak pretpostavlja da već imamo osnovno znanje.

Vrsta AOP-a koju ćemo implementirati u ovom članku temelji se na bilješkama. Možda nam je to već poznato ako smo koristili Proljeće @Transational napomena:

@Transactional public void orderGoods (Order order) {// Niz poziva baze podataka koji će se izvršiti u transakciji}

Ključ je ovdje neinvazivnost. Korištenjem metapodataka anotacija, naša osnovna poslovna logika nije zagađena našim kodom transakcije. To olakšava zaključivanje, refaktoriranje i izolirano testiranje.

Ponekad ljudi koji razvijaju proljetne aplikacije to mogu vidjetiSpring Magic ', bez detaljnog razmišljanja o tome kako to radi. U stvarnosti, ono što se događa nije osobito komplicirano. Međutim, nakon što dovršimo korake u ovom članku, moći ćemo stvoriti vlastitu prilagođenu napomenu kako bismo razumjeli i iskoristili AOP.

3. Ovisnost Mavena

Prvo, dodajmo naše ovisnosti o Mavenu.

U ovom ćemo primjeru koristiti Spring Boot, jer nam konvencionalnost pristupa konfiguraciji omogućuje što brže pokretanje:

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

Imajte na umu da smo uključili AOP starter, koji uvlači knjižnice koje su nam potrebne za početak implementacije aspekata.

4. Izrada naše prilagođene bilješke

Napomena koju ćemo stvoriti je ona koja će se koristiti za bilježenje vremena potrebno izvršenju metode. Stvorimo našu napomenu:

@Target (ElementType.METHOD) @Retention (RetentionPolicy.RUNTIME) public @interface LogExecutionTime {} 

Iako relativno jednostavna implementacija, vrijedi napomenuti čemu se služe te dvije meta-bilješke.

The @Cilj napomena nam govori gdje će naša primjedba biti primjenjiva. Ovdje koristimo ElementType.Method, što znači da će raditi samo na metodama. Ako bismo pokušali upotrijebiti bilješku bilo gdje drugdje, tada se naš kod ne bi uspio sastaviti. Ovakvo ponašanje ima smisla jer će se naša bilješka koristiti za vrijeme izvršavanja metode evidentiranja.

I @Zadržavanje samo navodi hoće li napomena biti dostupna JVM-u tijekom izvođenja ili ne. Prema zadanim postavkama nije, pa Spring AOP ne bi mogao vidjeti napomenu. Zbog toga je ponovno konfiguriran.

5. Stvaranje našeg aspekta

Sad imamo svoju napomenu, kreirajmo svoj aspekt. Ovo je samo modul koji će uvrstiti našu sveobuhvatnu brigu, što je naš slučaj evidentiranje vremena izvršenja metode. Sve što je to je klasa s naznakama @Aspekt:

@Aspect @Component javna klasa ExampleAspect {}

Uključili smo i @Komponenta napomena, jer i naša klasa treba biti proljetni grah da bi se otkrila. U osnovi, ovo je klasa u kojoj ćemo implementirati logiku za koju želimo da ubrizgava našu prilagođenu napomenu.

6. Stvaranje našeg točke i savjeta

Ajmo sada stvoriti naš točku i savjet. Ovo će biti anotirana metoda koja živi u našem aspektu:

@Around ("@ annotation (LogExecutionTime)") javni objekt logExecutionTime (ProceedingJoinPoint joinPoint) baca mogućnost bacanja {return joinPoint.proceed (); }

Tehnički ovo još ne mijenja ponašanje ničega, ali još se uvijek događa dosta toga što treba analizirati.

Prvo, označili smo našu metodu s @Oko. Ovo je naš savjet, a oko savjeta znači da dodajemo dodatni kôd i prije i nakon izvršavanja metode. Postoje i druge vrste savjeta, poput prije i nakon ali oni će biti izostavljeni iz ovog članka.

Dalje, naša @Oko anotacija ima argument za rezanje točke. Naš pointcut samo kaže: 'Primijenite ovaj savjet bilo kojoj metodi koja je označena @LogExecutionTime. ' Postoji puno drugih vrsta izrezivanja, ali oni će opet biti izostavljeni ako je doseg.

Metoda logExecutionTime () sam je naš savjet. Postoji jedan argument, ProceedingJoinPoint. U našem slučaju, ovo će biti izvršna metoda koja je označena @LogExecutionTime.

Konačno, kad se završi poziv naše anotirane metode, prvo će se pozvati naš savjet. Tada je na našem savjetu da odlučimo što dalje. U našem slučaju, naš savjet nije ništa drugo osim pozivanja continue (), što je samo pozivanje izvorne anotirane metode.

7. Zapisivanje vremena izvršenja

Sada imamo svoj kostur na mjestu, sve što trebamo učiniti je dodati dodatnu logiku našim savjetima. To će biti ono što zapisuje vrijeme izvršenja uz pozivanje izvorne metode. Dodajmo ovo dodatno ponašanje našim savjetima:

@Around ("@ annotation (LogExecutionTime)") javni objekt logExecutionTime (ProceedingJoinPoint joinPoint) baca mogućnost bacanja {long start = System.currentTimeMillis (); Objekt nastavi = joinPoint.proceed (); dugo izvršenje = System.currentTimeMillis () - start; System.out.println (joinPoint.getSignature () + "izvršeno u" + vrijeme izvršenja + "ms"); povratak nastaviti; }

Opet, ovdje nismo učinili ništa posebno komplicirano. Upravo smo zabilježili trenutno vrijeme, izvršili metodu, a zatim ispisali vrijeme potrebno za konzolu. Također bilježimo potpis metode koji je predviđen za upotrebu točka spajanja primjer. Također bismo mogli dobiti pristup drugim dijelovima informacija ako bismo to željeli, poput argumenata metode.

Pokušajmo sada označiti metodu s @LogExecutionTime, a zatim izvršavajući da vidi što će se dogoditi. Imajte na umu da ovo mora biti Spring Bean da bi ispravno radio:

@LogExecutionTime public void serve () baca InterruptedException {Thread.sleep (2000); }

Nakon izvršenja trebali bismo vidjeti sljedeće prijavljeno na konzolu:

void org.baeldung.Service.serve () izvršeno u 2030ms

8. Zaključak

U ovom smo članku iskoristili Spring Boot AOP kako bismo stvorili našu prilagođenu napomenu koju možemo primijeniti na Spring grah kako bismo im ubrizgali dodatno ponašanje tijekom izvođenja.

Izvorni kod za našu aplikaciju dostupan je na više od GitHub; ovo je Maven projekt koji bi trebao biti u mogućnosti pokrenuti se kakav jest.