Vstrekovanie konštruktéra na jar s Lombokom

1. Úvod

Lombok je mimoriadne užitočná knižnica prekonávajúca štandardný kód. Ak sa v ňom ešte nevyznáte, vrelo odporúčam pozrieť si predchádzajúci návod - Úvod do projektu Lombok.

V tomto článku si ukážeme jeho použiteľnosť v kombinácii s Spring Vkladanie závislostí založené na konštruktéroch.

2. Konštruktorovo závislé vstrekovanie

Dobrý spôsob, ako prepojiť závislosti na jar pomocou cinjektovanie závislostí založené na konštrukcii. Tento prístup nás núti explicitne odovzdávať závislosti komponentov konštruktoru.

Na rozdiel od Vkladanie závislostí do terénu, poskytuje tiež množstvo výhod:

  • nie je potrebné vytvárať konfiguračný komponent špecifický pre test - závislosti sa vkladajú explicitne do konštruktora
  • konzistentný dizajn - všetky požadované závislosti sú zdôraznené a postarané o ne podľa definície konštruktéra
  • jednoduché jednotkové testy - znížená réžia Spring Framework
  • regenerovaná sloboda používania konečné Kľúčové slová

Avšak kvôli potrebe písania konštruktora vedie k podstatne väčšiemu kódovému základu. Zvážte dva príklady Pozdravná služba a Služba rozlúčky:

@Component public class GreetingService {@Autowired private Translator translator; public String produce () {return translator.translate ("ahoj"); }}
@Component public class FarewellService {private final Prekladateľ prekladateľ; public FarewellService (prekladateľ prekladateľ) {this.translator = prekladateľ; } public String produce () {return translator.translate ("bye"); }}

V zásade obe zložky robia to isté - nazývajú sa konfigurovateľné Prekladateľ slovom pre konkrétnu úlohu.

Druhá variácia je však oveľa viac zahmlievaná kvôli základnému kódu konštruktora, ktorý kódu skutočne neprináša žiadnu hodnotu.

V najnovšom vydaní Spring nemusí byť jeho konštruktor anotovaný @Autowired anotácia.

3. Vstrekovanie konštruktéra pomocou Lomboku

S Lombok, je možné vygenerovať konštruktor pre všetky polia triedy (s @AllArgsConstructor) alebo všetky konečné polia triedy (s @RequiredArgsConstructor). Navyše, ak stále potrebujete prázdny konštruktor, môžete pridať ďalší @NoArgsConstructor anotácia.

Vytvorme tretí komponent, analogický s predchádzajúcimi dvoma:

@Component @RequiredArgsConstructor verejná trieda ThankingService {private final Prekladateľ prekladateľ; public String produce () {return translator.translate ("ďakujem"); }}

Vyššie uvedená anotácia spôsobí Lombok pre nás vygenerovať konštruktor:

@ Komponenta verejná trieda ThankingService {private final Prekladateľ prekladateľ; public String thank () {return translator.translate ("thank you"); } / * Generované spoločnosťou Lombok * / public ThankingService (prekladateľ prekladateľ) {this.translator = prekladač; }}

4. Viac konštruktérov

Konštruktor nemusí byť anotovaný, pokiaľ je v komponente iba jeden a Spring ho môže jednoznačne zvoliť ako správny na vytvorenie inštancie nového objektu. Keď ich bude viac, musíte tiež anotovať ten, ktorý má používať kontajner IoC.

Zvážte ApologizeService príklad:

@Component @RequiredArgsConstructor verejná trieda ApologizeService {súkromný konečný prekladateľ prekladateľ; súkromná záverečná reťazcová správa; @Autowired public ApologizeService (prekladateľ prekladateľ) {this (prekladateľ, „prepáč“); } public String produce () {return translator.translate (message); }}

Vyššie uvedený komponent je voliteľne konfigurovateľný s správa pole, ktoré sa po vytvorení komponentu nemôže zmeniť (teda nedostatok a stavač). Vyžadovalo si to teda, aby sme poskytli dvoch konštruktorov - jedného s úplnou konfiguráciou a druhého s implicitnou predvolenou hodnotou správa.

Pokiaľ nie je jeden z konštruktorov anotovaný ani jedným z nich @Autowired, @Inject alebo @ Zdroj, Jar vyhodí chybu:

Nepodarilo sa vytvoriť inštanciu [...]: Nebol nájdený žiadny predvolený konštruktor;

Ak by sme chceli anotovať Lombok-generovaný konštruktor, museli by sme anotáciu odovzdať s onConstructor parameter parametra @AllArgsConstructor:

@Component @RequiredArgsConstructor (onConstructor = @__ (@ Autowired)) verejná trieda ApologizeService {// ...}

The onConstructor parameter prijíma pole anotácií (alebo jednu anotáciu ako v tomto konkrétnom príklade), ktoré sa majú vložiť na vygenerovaný konštruktor. Fráza dvojitého podčiarknutia bola zavedená kvôli problémom so spätnou kompatibilitou. Podľa dokumentácie:

Dôvod zvláštnej syntaxe je, aby táto funkcia fungovala v kompilátoroch javac 7; the @__ type je odkaz na anotáciu typu anotácie __ (dvojité podčiarknutie), ktoré v skutočnosti neexistuje; toto robí javac 7 oneskorením prerušenia procesu kompilácie kvôli chybe, pretože je možné, že anotačný procesor neskôr vytvorí __ typu.

5. Zhrnutie

V tomto tutoriáli sme ukázali, že nie je potrebné zvýhodňovať DI na poli pred DI na základe konštruktora, pokiaľ ide o zvýšený štandardný kód.

Vďaka Lomboku je možné automatizovať bežné generovanie kódu bez dopadu na výkon za behu, skrátiť dlhý a zastierajúci kód na použitie jednoriadkovej anotácie.

Kód použitý počas tutoriálu je k dispozícii na GitHub.


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