Injektiranje ovisnosti konstruktora u proljeće

1. Uvod

Vjerojatno jedan od najvažnijih razvojnih principa modernog softverskog dizajna je Injektiranje ovisnosti (DI) što sasvim prirodno proizlazi iz drugog kritično važnog principa: Modularnost.

Ovaj će članak istražiti određenu vrstu DI tehnike koja se naziva Injekcija ovisnosti na temelju konstruktora unutar Springa - što jednostavno rečeno znači da se potrebne komponente prenose u klasu u trenutku instanciranja.

Za početak moramo uvesti proljeće-kontekst ovisnost u našem pom.xml:

 org.springframework proljeće-kontekst 5.2.8.OSLOBOĐENJE 

Tada moramo postaviti a Konfiguracija datoteka. Ova datoteka može biti POJO ili, ako želite, XML datoteka.

2. Konfiguracija temeljena na bilješkama

Java konfiguracijska datoteka prilično izgleda poput običnog starog Java objekta s nekim dodatnim bilješkama:

@Configuration @ComponentScan ("com.baeldung.constructordi") javna klasa Config {@Bean public Engine engine () {return new Engine ("v8", 5); } @Bean javni prijenos prijenos () {povratak novi prijenos ("klizanje"); }} 

Ovdje koristimo bilješke kako bismo obavijestili Spring runtime da je ova klasa pružatelj definicija graha (@Grah napomena) i da se skeniranje konteksta za dodatni grah mora izvesti u paketu com.baeldung.spring. Dalje, definiramo a Automobil razred:

@ Komponenta automobila javne klase {@Automobilski javni automobil (motor motora, prijenos mjenjača) {this.engine = motor; this.transmission = prijenos; }}

Proljeće će se susresti s našim Automobil klase dok vrši skeniranje paketa i inicijalizirat će njegovu instancu pozivanjem datoteke @Autowired anotirani konstruktor.

Primjerci Motor i mjenjač dobit će se pozivom @Grah anotirane metode Config razred. Napokon, trebamo pokrenuti strap ApplicationContext koristeći našu POJO konfiguraciju:

ApplicationContext context = new AnnotationConfigApplicationContext (Config.class); Automobil automobila = context.getBean (Car.class);

3. Implicitno ubrizgavanje konstruktora

Od proljeća 4.3, klase s jednim konstruktorom mogu izostaviti @Autowired bilješka. Lijepo malo praktičnosti i uklanjanja pločice!

Povrh toga, također počevši od 4.3, ubrizgavanje na temelju konstruktora može se iskoristiti @Konfiguracija komentirane satove. I da, ako takva klasa ima samo jedan konstruktor, @Autowired anotacija se također može izostaviti.

4. Konfiguracija temeljena na XML-u

Drugi način konfiguriranja izvođenja Spring s ubrizgavanjem ovisnosti na temelju konstruktora je upotreba XML konfiguracijske datoteke:

Imajte na umu da konstruktor-arg može prihvatiti doslovnu vrijednost ili referencu na drugi grah i to neobvezno eksplicitno indeks i tip može se pružiti. Tip i indeks atributi se mogu koristiti za rješavanje dvosmislenosti (na primjer ako konstruktor uzima više argumenata istog tipa).

Ime atribut se također može koristiti za podudaranje varijabli xml to java, ali tada vaš kôd mora biti sastavljen sa zastavicom za otklanjanje pogrešaka.

U ovom slučaju kontekst proljetne aplikacije treba pokrenuti pomoću ClassPathXmlApplicationContext:

ApplicationContext context = new ClassPathXmlApplicationContext ("baeldung.xml"); Automobil automobila = context.getBean (Car.class);

5. Prednosti i nedostaci

Ubrizgavanje konstruktora ima nekoliko prednosti u odnosu na ubrizgavanje na terenu.

Prva korist je provjerljivost. Pretpostavimo da ćemo jedinstveno testirati proljetni grah koji koristi ubrizgavanje polja:

javna klasa UserService {@Autowired private UserRepository userRepository; }

Tijekom gradnje a Korisnička usluga Primjerice, ne možemo inicijalizirati userRepository država. Jedini način da se to postigne je Reflection API, koji potpuno razbija enkapsulaciju. Također, rezultirajući kod bit će manje siguran u usporedbi s jednostavnim pozivom konstruktora.

Dodatno, subrizgavanje polja, ne možemo provesti invarijante na razini klase.Dakle, moguće je imati Korisnička usluga instance bez pravilno inicijalizirane userRepository. Stoga možemo doživjeti slučajnost NullPointerExceptiontu i tamo. Također, s ubrizgavanjem u konstruktor lakše je graditi nepromjenjive komponente.

Štoviše, Korištenje konstruktora za stvaranje primjeraka objekta prirodnije je s gledišta OOP-a.

S druge strane, glavni nedostatak ubrizgavanja u konstruktor je njegova opširnost, posebno kada grah ima pregršt ovisnosti. Ponekad to može biti maskirani blagoslov, jer se možemo više potruditi da broj ovisnosti bude minimalan.

6. Zaključak

Ovaj je brzi vodič predstavio osnove dva različita načina korištenja Injekcija ovisnosti na temelju konstruktora koristeći Spring Spring.

The puna provedba ovog vodiča možete pronaći na GitHubu.