Injekcija konstruktora u proljeće s Lombokom
1. Uvod
Lombok je izuzetno korisna knjižnica koja prevladava šifru uzorka. Ako vam još nisu poznati, toplo preporučujem da pogledate prethodni vodič - Uvod u projekt Lombok.
U ovom ćemo članku pokazati njegovu upotrebljivost u kombinaciji s Springovim Injekcija ovisnosti na temelju konstruktora.
2. Ubrizgavanje ovisnosti na temelju konstruktora
Dobar način povezivanja ovisnosti u proljeće pomoću cubrizgavanje ovisnosti na temelju konstruktora. Ovaj pristup prisiljava nas da eksplicitno prosljeđujemo ovisnosti komponenata konstruktoru.
Za razliku od Injekcija ovisnosti na temelju polja, također pruža niz prednosti:
- nema potrebe za izradom komponente konfiguracije specifične za test - ovisnosti se izričito ubrizgavaju u konstruktor
- konzistentan dizajn - sve potrebne ovisnosti ističu se i paze prema definiciji konstruktora
- jednostavni jedinični testovi - smanjeni su troškovi Spring Framework-a
- vraćena sloboda korištenja konačni ključne riječi
Međutim, zbog potrebe za pisanjem konstruktora, koristi se za znatno veću bazu koda. Razmotrite dva primjera Pozdravna usluga i Oproštajna usluga:
@Component javni razred GreetingService {@Automobilski privatni prevoditelj prevoditelj; javni String produce () {return translator.translate ("hello"); }}
@Component javni razred FarewellService {privatni završni prevoditelj prevoditelj; javna usluga opraštanja (prevoditelj prevoditelja) {this.translator = translator; } javni String produce () {return translator.translate ("bye"); }}
U osnovi, obje komponente rade isto - nazivaju ih podesivim Prevoditelj riječju specifičnom za zadatak.
Druga je varijacija, međutim, puno zamućenija zbog konstrukcijskog uzorka koji zapravo ne donosi nikakvu vrijednost kodu.
U najnovijem izdanju Springa, njegov konstruktor ne treba imati oznake @Autowired bilješka.
3. Injektiranje konstruktora s Lombokom
S Lombok, moguće je generirati konstruktor za bilo koja polja klase (sa @AllArgsConstructor) ili sve konačni polja klase (sa @RequiredArgsConstructor). Štoviše, ako vam i dalje treba prazan konstruktor, možete dodati dodatni @NoArgsConstructor bilješka.
Stvorimo treću komponentu, analognu prethodnim dvjema:
@Component @RequiredArgsConstructor javna klasa ThankingService {privatni konačni prevoditelj prevoditelj; javni String produce () {return translator.translate ("hvala"); }}
Gornja bilješka će uzrokovati Lombok za generiranje konstruktora za nas:
@Component public class ThankingService {private final Translator translator; javni String hvala () {return translator.translate ("hvala"); } / * Izradio Lombok * / public ThankingService (prevoditelj prevoditelja) {this.translator = translator; }}
4. Višestruki konstruktori
Konstruktor ne mora biti anotiran sve dok u komponenti postoji samo jedan i Spring ga može nedvosmisleno odabrati kao pravi za instanciranje novog objekta. Kad ih bude više, također trebate označiti onu koju će IoC spremnik koristiti.
Razmotrite Ispričavam seUsluga primjer:
@Component @RequiredArgsConstructor javna klasa ApologizeService {privatni konačni prevoditelj prevoditelj; privatna konačna niska poruka; @Autowired public ApologizeService (prevoditelj prevoditelja) {this (prevoditelj, "oprosti"); } javni String produce () {return translator.translate (poruka); }}
Gornju komponentu moguće je konfigurirati s poruka polje koje se nakon kreiranja komponente ne može promijeniti (dakle nedostatak a seter). Stoga je zahtijevalo da pružimo dva konstruktora - jedan s potpunom konfiguracijom, a drugi s implicitnom, zadanom vrijednošću poruka.
Osim ako nijedan od konstruktora nije označen nijednim @Autowired, @Ubrizgati ili @Resurs, Proljeće će izbaciti pogrešku:
Instanciranje nije uspjelo [...]: Nije pronađen zadani konstruktor;
Ako bismo željeli bilježiti Lombok-generirani konstruktor, morali bismo proslijediti napomenu s onConstructor parametar @AllArgsConstructor:
@Component @RequiredArgsConstructor (onConstructor = @__ (@ Autowired)) javna klasa ApologizeService {// ...}
The onConstructor parametar prihvaća niz bilješki (ili jednu napomenu kao u ovom konkretnom primjeru) koje treba staviti na generirani konstruktor. Idiom dvostruke donje crte uveden je zbog problema s povratnom kompatibilnošću. Prema dokumentaciji:
Razlog čudne sintakse je da ova značajka radi u javac 7 kompajlerima; the @__
type je napomena koja upućuje na vrstu bilješke __
(dvostruko podvlačenje) koje zapravo ne postoji; ovo čini da javac 7 odgađa prekid postupka kompilacije zbog pogreške jer je moguće da će procesor bilješki kasnije stvoriti __
tip.
5. Sažetak
U ovom uputstvu pokazali smo da nema potrebe favorizirati DI temeljeno na terenu u odnosu na DI konstruktora u smislu povećanog koda.
Zahvaljujući Lomboku, moguće je automatizirati generiranje uobičajenog koda bez utjecaja na izvedbu na vrijeme izvođenja, skraćujući dugi, zastirući kôd korištenjem napomene u jednom retku.
Kôd korišten tijekom podučavanja dostupan je na GitHub-u.