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.