Vstrekovanie závislostí konštruktéra na jar

1. Úvod

Pravdepodobne jeden z najdôležitejších vývojových princípov moderného softvérového dizajnu je Závislosť Injection (DI) ktorý úplne prirodzene vyteká z iného kriticky dôležitého princípu: Modularita.

Tento článok bude skúmať konkrétny typ techniky DI nazývanú Vkladanie závislostí založené na konštruktéroch v rámci jari - čo zjednodušene znamená, že požadované komponenty sa v okamihu vytvorenia triedy odovzdajú do triedy.

Na začiatok je potrebné importovať jarný kontext závislosť v našom pom.xml:

 org.springframework spring-context 5.2.8.RELEASE 

Potom musíme nastaviť a Konfigurácia spis. Tento súbor môže byť buď POJO, alebo ak chcete, súbor XML.

2. Konfigurácia založená na anotáciách

Konfiguračný súbor Java vyzerá skoro ako obyčajný objekt Java s niekoľkými ďalšími anotáciami:

@Configuration @ComponentScan ("com.baeldung.constructordi") verejná trieda Config {@Bean public Engine Engine () {return new Engine ("v8", 5); } @Bean public Transmission transmission () {return new Transmission ("sliding"); }} 

Tu používame anotácie, aby sme oznámili Spring runtime, že táto trieda je poskytovateľom definícií fazúľ (@Bean anotácia) a že v balíku je potrebné vykonať kontextové skenovanie na ďalšie fazule com.baeldung.spring. Ďalej definujeme a Auto trieda:

@Component public class Car {@Autowired public Car (Engine engine, Transmission transmission) {this.engine = engine; this.transmission = prenos; }}

Jar sa stretne s našou Auto triedy pri skenovaní balíka a inicializuje svoju inštanciu volaním súboru @Autowired komentovaný konštruktor.

Prípady Motor a prevodovka sa získa volaním @Bean anotované metódy Konfig trieda. Nakoniec musíme zaviesť bootstrap ApplicationContext pomocou našej konfigurácie POJO:

ApplicationContext context = nový AnnotationConfigApplicationContext (Config.class); Car car = context.getBean (Car.class);

3. Implicitné vstrekovanie konštruktora

Od jari 4.3 môžu triedy s jediným konštruktorom vynechať znak @Autowired anotácia. Príjemné malé pohodlie a odstránenie varného štítku!

Okrem toho, počnúc verziou 4.3, je možné využiť injekciu na základe konštruktéra @ Konfigurácia anotované triedy. A áno, ak má takáto trieda iba jedného konštruktora, @Autowired možno tiež vynechať anotáciu.

4. Konfigurácia založená na XML

Ďalším spôsobom, ako nakonfigurovať jarný runtime pomocou vkladania závislostí založených na konštruktore, je použitie konfiguračného súboru XML:

Poznač si to konštruktér-arg môže prijať doslovnú hodnotu alebo odkaz na iný fazuľa a to ako voliteľný explicitný index a typu môžu byť poskytnuté. Typ a index atribúty možno použiť na vyriešenie nejednoznačnosti (napríklad ak konštruktor vezme viac argumentov rovnakého typu).

názov atribút je možné použiť aj na priradenie premenných xml k java, ale potom k vášmu kódu musieť byť zostavený s ladiacim príznakom na.

Kontext aplikácie Spring, v tomto prípade, je potrebné bootstrapovať pomocou ClassPathXmlApplicationContext:

ApplicationContext context = nový ClassPathXmlApplicationContext ("baeldung.xml"); Car car = context.getBean (Car.class);

5. Klady a zápory

Vstrekovanie konštruktéra má v porovnaní s poľným vstrekovaním niekoľko výhod.

Prvou výhodou je testovateľnosť. Predpokladajme, že ideme na jednotku otestovať jarnú fazuľu, ktorá používa injekciu poľa:

verejná trieda UserService {@Autowired private UserRepository userRepository; }

Pri stavbe a UserService inštanciu nemôžeme inicializovať userRepository štát. Jediný spôsob, ako to dosiahnuť, je prostredníctvom rozhrania Reflection API, ktoré úplne rozbije zapuzdrenie. Výsledný kód bude tiež menej bezpečný v porovnaní s jednoduchým volaním konštruktora.

Navyše, spoľné vstrekovanie, nemôžeme vynútiť invarianty na úrovni triedy.Takže je možné mať UserService napríklad bez správne inicializovaného userRepository. Preto môžeme zažiť náhodné NullPointerExceptionje tu a tam. Vďaka injektovaniu konštruktora je tiež jednoduchšie vytvoriť nemenné komponenty.

Navyše, použitie konštruktorov na vytváranie inštancií objektov je z hľadiska OOP prirodzenejšie.

Na druhej strane, hlavnou nevýhodou injektovania konštruktora je jeho výrečnosť, najmä keď má fazuľa niekoľko závislostí. Niekedy to môže byť zamaskované požehnanie, pretože sa môžeme viac pokúsiť udržať počet závislostí minimálny.

6. Záver

Tento rýchly tutoriál predstavil základy dvoch odlišných spôsobov použitia Vkladanie závislostí založené na konštruktéroch pomocou jarného rámca.

The úplná implementácia tohto tutoriálu nájdete na GitHub.


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