Constructor Injection våren med Lombok

1. Introduksjon

Lombok er et ekstremt nyttig bibliotek som overvinner kokerplatekoden. Hvis du ikke er kjent med det ennå, anbefaler jeg på det sterkeste å ta en titt på forrige opplæring - Introduksjon til Project Lombok.

I denne artikkelen vil vi demonstrere brukervennligheten når den kombineres med vårens Konstruktørbasert avhengighetsinjeksjon.

2. Konstruktørbasert avhengighetsinjeksjon

En god måte å koble avhengigheter om våren ved hjelp av cinstruktørbasert avhengighetsinjeksjon. Denne tilnærmingen tvinger oss til å eksplisitt overføre komponentens avhengighet til en konstruktør.

I motsetning til Feltbasert avhengighetsinjeksjon, det gir også en rekke fordeler:

  • ikke behov for å lage en testspesifikk konfigurasjonskomponent - avhengigheter injiseres eksplisitt i en konstruktør
  • konsekvent design - alle nødvendige avhengigheter blir vektlagt og ivaretatt av konstruktørens definisjon
  • enkle enhetstester - reduserte Spring Framework's overhead
  • gjenvunnet bruksfrihet endelig søkeord

På grunn av behovet for å skrive en konstruktør bruker det imidlertid å føre til en betydelig større kodebase. Tenk på de to eksemplene på HilsenService og FarvelService:

@Komponent offentlig klasse GreetingService {@Autowired privat oversetteroversetter; public String produce () {return translator.translate ("hei"); }}
@Komponent offentlig klasse FarewellService {privat slutt Oversetteroversetter; public FarewellService (Oversetteroversetter) {this.translator = oversetter; } public String produce () {return translator.translate ("bye"); }}

I utgangspunktet gjør begge komponentene det samme - de kaller en konfigurerbar Oversetter med et oppgavespesifikt ord.

Den andre variasjonen er imidlertid mye mer forvirret på grunn av konstruktørens kjeleplate som egentlig ikke gir noen verdi til koden.

I den nyeste vårutgivelsen trenger ikke konstruktøren å bli merket med @Autowired kommentar.

3. Konstruktørinjeksjon med Lombok

Med Lombok, er det mulig å generere en konstruktør for enten alle klassens felt (med @AllArgsConstructor) eller alle endelig klassens felt (med @RequiredArgsConstructor). Videre, hvis du fortsatt trenger en tom konstruktør, kan du legge til en ekstra @NoArgsConstructor kommentar.

La oss lage en tredje komponent, analog med de to foregående:

@Component @RequiredArgsConstructor offentlig klasse ThankingService {privat slutt Oversetter oversetter; public String produce () {return translator.translate ("takk"); }}

Ovennevnte kommentar vil forårsake Lombok å generere en konstruktør for oss:

@Komponent offentlig klasse ThankingService {privat slutt Oversetteroversetter; public String thank () {return translator.translate ("thank you"); } / * Generert av Lombok * / public ThankingService (oversetteroversetter) {this.translator = oversetter; }}

4. Flere konstruktører

En konstruktør trenger ikke å bli kommentert så lenge det bare er en i en komponent, og Spring kan utvetydig velge den som den rette for å sette i gang et nytt objekt. Når det er flere, må du også kommentere den som skal brukes av IoC-beholderen.

Vurder Beklager service eksempel:

@Component @RequiredArgsConstructor offentlig klasse ApologizeService {privat slutt Oversetter oversetter; privat slutt Stringmelding; @Autowired public ApologizeService (Oversetteroversetter) {dette (oversetter, "beklager"); } public String produce () {return translator.translate (melding); }}

Komponenten ovenfor er valgfritt konfigurerbar med beskjed felt som ikke kan endres etter at komponenten er opprettet (derav mangelen på et setter). Det krevde oss derfor å gi to konstruktører - en med full konfigurasjon og den andre med en implisitt, standardverdi for beskjed.

Med mindre en av konstruktørene er merket med noen av dem @Autowired, @Injiser eller @Ressurs, Våren vil kaste en feil:

Kunne ikke starte [...]: Fant ingen standardkonstruktører;

Hvis vi ønsket å kommentere Lombok-generert konstruktør, måtte vi passere kommentaren med en onConstructor parameteren til @AllArgsConstructor:

@Component @RequiredArgsConstructor (onConstructor = @__ (@ Autowired)) offentlig klasse ApologizeService {// ...}

De onConstructor parameter aksepterer en rekke merknader (eller en enkelt merknad som i dette spesifikke eksemplet) som skal settes på en generert konstruktør. Det doble understrekingsidiomet er introdusert på grunn av problemer med bakoverkompatibilitet. I følge dokumentasjonen:

Årsaken til den rare syntaksen er å få denne funksjonen til å fungere i javac 7-kompilatorer; de @__ type er en merknadshenvisning til merketypen __ (dobbel understreking) som faktisk ikke eksisterer; Dette gjør at javac 7 forsinker å avbryte kompileringsprosessen på grunn av en feil fordi det er mulig at en merkeprosessor senere vil opprette __ type.

5. Sammendrag

I denne opplæringen viste vi at det ikke er behov for å favorisere feltbasert DI fremfor konstruktørbasert DI når det gjelder økt kjeleplatekode.

Takket være Lombok er det mulig å automatisere vanlig kodegenerering uten ytelsespåvirkning på kjøretid, forkortet lang, tilslørende kode til bruk av en enkeltlinjeanmerkning.

Koden som ble brukt under opplæringen, er tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found