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.