Vstrekovanie jarných bôbov do neriadených objektov

1. Hnacie sily

V jarnej aplikácii je injekcia jednej fazule do inej fazule veľmi častá. Avšak niekedy je žiaduce vpichnúť fazuľu do obyčajného predmetu. Napríklad môžeme chcieť získať odkazy na služby z objektu entity.

Našťastie dosiahnutie toho nie je také ťažké, ako by sa mohlo zdať. V nasledujúcich častiach sa dozviete, ako na to pomocou @ Konfigurovateľné anotácia a tkáč AspectJ.

2. The @ Konfigurovateľné Anotácia

Táto anotácia umožňuje inštanciám zdobenej triedy uchovávať odkazy na jarné fazule.

2.1. Definovanie a registrácia jarnej fazule

Pred zakrytím @ Konfigurovateľné anotáciu, nastavme definíciu jarnej fazule:

@Service verejná trieda IdService {private static int count; int generateId () {návrat ++ počet; }}

Táto trieda je zdobená @Služba anotácia; teda môže byť zaregistrovaný v jarnom kontexte pomocou skenovania komponentov.

Tu je jednoduchá trieda konfigurácie umožňujúca tento mechanizmus:

@ComponentScan verejná trieda AspectJConfig {}

2.2. Použitím @ Konfigurovateľné

V najjednoduchšej podobe môžeme použiť @ Konfigurovateľné bez prvku:

@ Konfigurovateľná verejná trieda PersonObject {private int id; súkromné ​​meno reťazca; public PersonObject (názov reťazca) {this.name = meno; } // vyhľadávače a ďalší kód zobrazený v nasledujúcej podsekcii}

The @ Konfigurovateľné anotácia, v tomto prípade označuje PersonObject triedy ako spôsobilý pre konfiguráciu poháňanú pružinou.

2.3. Injekcia jarnej fazule do nespravovaného objektu

Môžeme vstreknúť IdService do PersonObject, rovnako ako v akejkoľvek jarnej fazuli:

@ Konfigurovateľná verejná trieda PersonObject {@Autowired private IdService idService; // polia, konštruktor a getre - zobrazené v predchádzajúcej podsekcii void generateId () {this.id = idService.generateId (); }}

Anotácia je však užitočná, iba ak ju rozpozná a spracuje obslužná rutina. To je miesto, kde vstúpi do hry AspectJ weaver. Konkrétne the AnnotationBeanConfigurerAspect bude konať za prítomnosti @ Konfigurovateľné a robí potrebné spracovanie.

3. Povolenie tkania AspectJ

3.1. Vyhlásenie o doplnku

Aby sme umožnili tkanie AspectJ, potrebujeme najskôr doplnok AspectJ Maven:

 org.codehaus.mojo aspectj-maven-plugin 1.11 

Vyžaduje si to ďalšiu konfiguráciu:

 1.8 ignoruje jarné aspekty org.springframework 

Prvý požadovaný prvok je úroveň súladu. Hodnota 1.8 nastavuje zdrojovú aj cieľovú verziu JDK na 1.8. Ak nie je stanovené výslovne, zdrojová verzia by bola 1,3 a cieľová bola 1,1. Tieto hodnoty sú zjavne zastarané a pre modernú aplikáciu Java nestačia.

Pri vpichnutí fazule do nespravovaného objektu sa musíme spoliehať na AnnotationBeanConfigurerAspect trieda uvedená v jar-aspekty.jar. Pretože sa jedná o vopred zostavený aspekt, bolo by treba pridať artefakt, ktorý obsahuje, do konfigurácie pluginu.

Upozorňujeme, že takýto odkazovaný artefakt musí v projekte existovať ako závislosť:

 aspekty pružiny org.springframework 5.2.7.RELEASE 

Nájdeme najnovšiu verziu servera jarné aspekty na Maven Central.

3.2. Vykonanie pluginu

Aby sme doplnku dali pokyn, aby pretkal všetky príslušné triedy, potrebujeme to exekúcie konfigurácia:

   zostaviť 

Všimnite si doplnku zostaviť cieľ sa predvolene viaže na fázu životného cyklu kompilácie.

3.2. Konfigurácia fazule

Posledným krokom, ktorý umožní tkanie AspectJ, je pridať @EnableSpringConfigured do konfiguračnej triedy:

@ComponentScan @EnableSpringConfigured verejná trieda AspectJConfig {}

Konfiguruje sa ďalšia anotácia AnnotationBeanConfigurerAspect, ktorý zasa registruje PersonObject inštancie s kontajnerom Spring IoC.

4. Testovanie

Teraz si overme, či IdService fazuľa bola úspešne vstreknutá do a PersonObject:

@RunWith (SpringRunner.class) @ContextConfiguration (classes = AspectJConfig.class) verejná trieda PersonUnitTest {@Test public void givenUnmanagedObjects_whenInjectingIdService_thenIdValueIsCorrectlySet () {PersonObject personObject personObject personObject personObject personObject personObject personObject.generateId (); assertEquals (1, personObject.getId ()); assertEquals ("Baeldung", personObject.getName ()); }}

5. Injekcia fazule do subjektu JPA

Z pohľadu jarného kontajnera nie je entita nič iné ako obyčajný objekt. Preto nie je na vstrekovaní jarnej fazule do entity JPA nič zvláštne.

Pretože je však injekcia do subjektov JPA typickým prípadom použitia, poďme sa na ňu venovať podrobnejšie.

5.1. Trieda entity

Začnime kostrou triedy entity:

@Entity @Configurable (preConstruction = true) verejná trieda PersonEntity {@Id súkromné ​​int ID; súkromné ​​meno reťazca; public PersonEntity () {} // iný kód - zobrazený v nasledujúcej podsekcii}

Všimnite si predkonštrukcia prvok v @ Konfigurovateľné anotácia: umožňuje nám to vložiť závislosť do objektu skôr, ako je úplne zostrojený.

5.2. Servisné vstrekovanie

Teraz môžeme vstreknúť IdService do PersonEntity, podobne ako sme to robili PersonObject:

// anotácie verejná trieda PersonEntity {@Autowired @Transient private IdService idService; // polia a konstruktor no-arg public PersonEntity (názov reťazca) {id = idService.generateId (); this.name = meno; } // zakladatelia}

The @ Prechodné anotácia sa používa na informovanie JPA idService je pole, ktoré sa nemá vytrvať.

5.3. Aktualizácia testovacej metódy

Na záver môžeme aktualizovať testovaciu metódu, aby sme naznačili, že službu je možné vložiť do entity:

@Test public void givenUnmanagedObjects_whenInjectingIdService_thenIdValueIsCorrectlySet () {// existujúce vyhlásenia PersonEntity personEntity = new PersonEntity ("Baeldung"); assertEquals (2, personEntity.getId ()); assertEquals ("Baeldung", personEntity.getName ()); }

6. Upozornenia

Aj keď je pohodlné pristupovať k komponentom Spring z nespravovaného objektu, často to nie je dobrý postup.

Problém je v tom, že nespravované objekty vrátane entít sú zvyčajne súčasťou doménového modelu. Tieto objekty by mali prenášať údaje, len aby boli opakovane použiteľné v rôznych službách.

Injekcia fazule do takýchto predmetov by mohla spojiť komponenty a predmety dohromady, čo sťažuje údržbu a vylepšenie aplikácie.

7. Záver

Tento tutoriál prešiel procesom vstrekovania fazule Spring do nespravovaného objektu. Spomenul tiež problém s dizajnom spojený so vstrekovaním závislostí do objektov.

Implementačný kód nájdete na GitHub.


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