A tavaszi bab kezeletlen objektumokba történő beadása

1. Hajtóerők

Tavaszi alkalmazásban nagyon gyakori az egyik bab másik injekció beadása. Néha azonban kívánatos egy babot egy közönséges tárgyba injektálni. Például érdemes lehet hivatkozásokat szerezni a szolgáltatásokra egy entitás objektumon belül.

Szerencsére ennek elérése nem olyan nehéz, mint amilyennek látszhat. A következő szakaszok bemutatják ennek módját használni a @ Konfigurálható annotáció és egy AspectJ takács.

2. A @ Konfigurálható Megjegyzés

Ez a megjegyzés lehetővé teszi, hogy a díszített osztály példányai a tavaszi babokra utaljanak.

2.1. A tavaszi bab meghatározása és regisztrálása

Mielőtt lefedné a @ Konfigurálható annotációval állítsunk be egy tavaszi babdefiníciót:

@Service public class IdService {private static int count; int generatorId () {return ++ count; }}

Ezt az osztályt a @Szolgáltatás annotáció; ennélfogva a Spring kontextusban regisztrálható alkatrész szkenneléssel.

Itt van egy egyszerű konfigurációs osztály, amely lehetővé teszi ezt a mechanizmust:

@ComponentScan nyilvános osztály AspectJConfig {}

2.2. Használata @ Konfigurálható

A legegyszerűbb formájában tudjuk használni @ Konfigurálható minden elem nélkül:

@ Konfigurálható nyilvános osztály PersonObject {private int id; privát karakterlánc neve; public PersonObject (karakterlánc neve) {this.name = név; } // getters és más kód a következő alfejezetben látható}

A @ Konfigurálható annotáció, ebben az esetben jelöli a PersonObject osztály jogosult a rugó által vezérelt konfigurációra.

2.3. Tavaszi bab beadása nem kezelt objektumba

Beadhatunk injekciót IdService -ba PersonObject, mint bármelyik tavaszi bab esetében:

@ Konfigurálható nyilvános osztály PersonObject {@Autowired private IdService idService; // mezők, konstruktor és getterek - az előző alfejezetben láthatók }}

A kommentár azonban csak akkor hasznos, ha a kezelő felismeri és feldolgozza. Itt lép színre az AspectJ takács. Kimondottan, a AnnotationBeanConfigurerAspect jelenlétére fog cselekedni @ Konfigurálható és elvégzi a szükséges feldolgozást.

3. Az AspectJ szövés engedélyezése

3.1. Plugin nyilatkozat

Az AspectJ szövés engedélyezéséhez először az AspectJ Maven beépülő modulra van szükségünk:

 org.codehaus.mojo szempontj-maven-plugin 1.11 

És további konfigurációt igényel:

 1.8 figyelmen kívül hagyja az org.springframework tavaszi szempontokat 

Az első szükséges elem az complianceLevel. Értéke 1.8 a forrás és a cél JDK verziót egyaránt 1,8-ra állítja. Ha nincs egyértelműen beállítva, akkor a forrásverzió 1,3, a cél pedig 1,1 lenne. Ezek az értékek nyilvánvalóan elavultak, és nem elegendők egy modern Java alkalmazáshoz.

Ha babot akarunk beadni egy nem kezelt objektumba, a következőkre kell támaszkodnunk AnnotationBeanConfigurerAspect osztályban biztosított tavaszi szempontok.jar. Mivel ez egy előre összeállított szempont, szükségünk lenne rá adja hozzá a benne lévő tárgyat a plugin konfigurációjához.

Ne feledje, hogy egy ilyen hivatkozott műtárgynak függőségként kell léteznie a projektben:

 org.springframework tavaszi szempontok 5.2.7.KÖZLEMÉNY 

Megtalálhatjuk a legújabb verzióját tavaszi szempontok a Maven Central-on.

3.2. Bővítmény végrehajtása

Erre szükségünk van, hogy a plugint utasítsuk az összes releváns osztály szövésére kivégzések konfiguráció:

   összeállítani 

Értesítés a plugin összeállítani A cél alapértelmezés szerint a fordítás életciklus szakaszához kötődik.

3.2. Babkonfiguráció

Az AspectJ szövés engedélyezésének utolsó lépése az hozzá @EnableSpringConfigured a konfigurációs osztályba:

@ComponentScan @EnableSpringConfigured public class AspectJConfig {}

Az extra kommentár konfigurálódik AnnotationBeanConfigurerAspect, ami viszont regisztrál PersonObject példányok Spring IoC tárolóval.

4. Tesztelés

Most ellenőrizzük, hogy a IdService babot sikeresen beadták a PersonObject:

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

5. Bab beadása JPA entitásba

A tavaszi konténer szempontjából az entitás nem más, mint egy közönséges tárgy. Mint ilyen, nincs semmi különös abban, ha tavaszi babot injektálnak a JPA entitásba.

Mivel azonban a JPA entitásokba történő injektálás tipikus felhasználási eset, térjünk ki rá részletesebben.

5.1. Entitás osztály

Kezdjük az entitásosztály vázával:

@Entity @Configurable (preConstruction = true) public class PersonEntity {@Id private int id; privát karakterlánc neve; public PersonEntity () {} // egyéb kód - a következő alfejezetben látható}

Figyelje meg a előépítés elem a @ Konfigurálható kommentár: ez lehetővé teszi számunkra, hogy függőséget injektáljunk az objektumba, mielőtt az teljesen felépülne.

5.2. Szolgáltatás befecskendezése

Most beadhatunk injekciót IdService -ba PersonEntity, hasonlóan ahhoz, mint amit csináltunk PersonObject:

// annotations public class PersonEntity {@Autowired @Transient private IdService idService; // mezők és no-arg konstruktor public PersonEntity (karakterlánc neve) {id = idService.generateId (); ez.név = név; } // getters}

A @ Átmeneti annotációval mondják el a JPA-nak idService olyan mező, amelyet nem szabad kitartani.

5.3. Vizsgálati módszer frissítése

Végül frissíthetjük a tesztelési módszert annak jelzésére, hogy a szolgáltatás beadható az entitásba:

@Test public void givenUnmanagedObjects_whenInjectingIdService_thenIdValueIsCorrectlySet () {// meglévő állítások PersonEntity personEntity = új PersonEntity ("Baeldung"); assertEquals (2, personEntity.getId ()); assertEquals ("Baeldung", personEntity.getName ()); }

6. Figyelmeztetések

Noha kényelmes a rugó alkatrészeinek kezelése egy nem felügyelt objektumból, gyakran nem jó gyakorlat ezt megtenni.

A probléma az, hogy a nem felügyelt objektumok, beleértve az entitásokat is, általában a tartománymodell részét képezik. Ezek az objektumok csak azért hordozhatnak adatokat, hogy újrafelhasználhatók legyenek a különböző szolgáltatásokban.

A bab ilyen tárgyakba történő befecskendezése összetevőket és tárgyakat köthet össze, ami megnehezíti az alkalmazás fenntartását és továbbfejlesztését.

7. Következtetés

Ez az oktatóanyag végigvitte a tavaszi bab befecskendezésének folyamatát egy nem kezelt objektumba. Megemlítette a tárgyak függőségének injektálásával kapcsolatos tervezési kérdést is.

A megvalósítási kód megtalálható a GitHub oldalon.