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.