Konstruktor befecskendezése tavasszal Lombokkal
1. Bemutatkozás
A Lombok egy rendkívül hasznos könyvtár, amely leküzdi a kazánlap kódját. Ha még nem ismeri, nagyon ajánlom, hogy vessen egy pillantást az előző bemutatóra - Bevezetés a Lombok projektbe.
Ebben a cikkben bemutatjuk annak használhatóságát, ha a Spring-kel kombináljuk Konstruktor alapú függőségi injekció.
2. Konstruktor alapú függőségi injekció
Egy jó módszer a függőségek bekötésére tavasszal a c használatávalonstructor-alapú függőségi injekció. Ez a megközelítés arra kényszerít bennünket, hogy kifejezetten átadjuk az alkatrész függőségeit egy konstruktornak.
Szemben a Terepi függőségi injekció, számos előnnyel is jár:
- nincs szükség teszt-specifikus konfigurációs komponens létrehozására - a függőségeket kifejezetten egy konstruktor injektálja
- következetes tervezés - az összes szükséges függőséget a kivitelező meghatározza és hangsúlyozza
- egyszerű egységtesztek - csökkenti a Spring Framework általános költségeit
- visszaszerezte a használat szabadságát végső kulcsszavak
A konstruktor írásának szükségessége miatt azonban lényegesen nagyobb kódbázishoz vezet. Tekintsük a két példát GreetingService és Búcsúszolgáltatás:
@ Component public class GreetingService {@Autowired private Translator fordító; public String produkció () {return translator.translate ("hello"); }}
@ Component public class FarewellService {private final Translator fordító; public Búcsúszolgáltatás (fordító fordító) {this.translator = fordító; } public String produkció () {return translator.translate ("viszlát"); }}
Alapvetően mindkét komponens ugyanazt csinálja - konfigurálhatónak hívják őket Fordító feladatspecifikus szóval.
A második változat azonban sokkal inkább el van zavarodva a konstruktor kazánja miatt, amely valójában nem hoz értéket a kódnak.
A legújabb Spring kiadásban a konstruktort nem kell megjegyzéssel ellátni @Autowired annotáció.
3. Konstruktor injekciója Lombokkal
Val vel Lombok, lehetséges létrehozni egy konstruktort bármelyik osztály mezőjéhez (a @AllArgsConstructor) vagy mindet végső osztály mezői (a @RequiredArgsConstructor). Sőt, ha még mindig szüksége van egy üres kivitelezőre, csatolhat egy további elemet @NoArgsConstructor annotáció.
Hozzunk létre egy harmadik komponenst, amely hasonló az előző kettőhöz:
@Component @RequiredArgsConstructor nyilvános osztály ThankingService {private final Translator fordító; public String produkció () {return translator.translate ("köszönöm"); }}
A fenti kommentár okozza Lombok hogy létrehozzunk egy konstruktort nekünk:
@ Component public class ThankingService {private final Translator fordító; public String köszönöm () {return translator.translate ("köszönöm"); } / * Lombok által generált * / public ThankingService (Translator translator) {this. fordító = fordító; }}
4. Több kivitelező
A konstruktort nem kell kommentálni, amíg csak egy van egy komponensben, és Spring egyértelműen kiválaszthatja a megfelelőnek egy új objektum példányosítására. Ha több van, akkor fel kell tüntetnie azt is, amelyet az IoC konténere használ.
Tekintsük a ApologizeService példa:
@Component @RequiredArgsConstructor nyilvános osztály ApologizeService {private final Translator fordító; private final String üzenet; @Autowired public ApologizeService (Translator translator) {this (fordító, "sajnálom"); } public String produkció () {return translator.translate (üzenet); }}
A fenti komponens opcionálisan konfigurálható a üzenet mező, amely az összetevő létrehozása után nem változhat (ezért hiányzik az a szetter). Ezért két konstruktort kellett megadnunk - az egyik teljes konfigurációval, a másik pedig a implicit, alapértelmezett értékkel üzenet.
Hacsak egyik kivitelező egyikét sem jegyzik @Autowired, @ Injekció vagy @Forrás, A tavasz hibát dob:
Nem sikerült a [...] példányosítása: Nem található alapértelmezett konstruktor;
Ha jegyzetelni akarnánk a Lombok-generált konstruktor, akkor át kell adnunk az annotációt onConstructor paramétere @AllArgsConstructor:
@Component @RequiredArgsConstructor (onConstructor = @__ (@ Autowired)) nyilvános osztály ApologizeService {// ...}
A onConstructor A paraméter elfogad egy annotáció tömböt (vagy egyetlen annotációt, mint ebben a konkrét példában), amelyeket egy generált konstruktorra kell feltenni. A kettős aláhúzási idiómát a visszafelé kompatibilitási problémák miatt vezették be. A dokumentáció szerint:
A furcsa szintaxis oka az, hogy ezt a szolgáltatást működtetni kell a javac 7 fordítókban; a @__
type egy annotációs hivatkozás a annotation típusra __
(kettős aláhúzás), amely valójában nem létezik; emiatt a javac 7 késlelteti a fordítási folyamat megszakítását egy hiba miatt, mert lehetséges, hogy egy annotációs processzor később létrehozza __
típus.
5. Összefoglalás
Ebben az oktatóanyagban megmutattuk, hogy a megnövekedett kazánlap kód szempontjából nincs szükség a terepi alapú DI előnyben részesítésére a konstruktor alapú DI-vel szemben.
A Lombok jóvoltából lehetőség van a közös kódgenerálás automatizálására a futásidejű teljesítményre gyakorolt hatás nélkül, rövidítve a hosszú, homályos kódot az egysoros kommentár használatával.
Az oktatóanyag során használt kód elérhető a GitHubon.