Vodič za proljeće @Autowired

1. Pregled

Počevši od proljeća 2.5, okvir je predstavio napomene Injekcija ovisnosti. Glavna napomena ove značajke je @Autowired.Omogućuje Springu da razriješi i ubrizga grah koji surađuje u naš grah.

U ovom uputstvu prvo ćemo pogledati kako omogućiti automatsko ožičenje iraznimnačini automatskog povezivanja graha. Poslije ćemo razgovarati o tome rješavanje sukoba graha pomoću @Kvalifikator napomena, kao i potencijalni scenariji izuzetaka.

2. Omogućavanje @Autowired Bilješke

Spring okvir omogućuje automatsko ubrizgavanje ovisnosti. Drugim riječima, deklariranjem svih ovisnosti o grahu u proljetnoj konfiguracijskoj datoteci, Spring spremnik može automatski povezati odnose između grahova koji surađuju. Ovo se zove Autožičenje proljetnog graha.

Da bismo koristili konfiguraciju zasnovanu na Javi u našoj aplikaciji, omogućimo ubrizgavanje na temelju napomenaza učitavanje naše konfiguracije Spring:

@Configuration @ComponentScan ("com.baeldung.autowire.sample") javna klasa AppConfig {}

Alternativno, napomena se uglavnom koristi za aktiviranje napomena ubrizgavanja ovisnosti u proljetnim XML datotekama.

Štoviše, Spring Boot predstavlja @SpringBootApplication bilješka. Ova pojedinačna bilješka ekvivalentna je upotrebi @Konfiguracija, @EnableAutoConfiguration, i @ComponentScan.

Upotrijebimo ovu napomenu u glavnoj klasi aplikacije:

@SpringBootApplication class VehicleFactoryApplication {public static void main (String [] args) {SpringApplication.run (VehicleFactoryApplication.class, args); }}

Kao rezultat toga, kada pokrenemo ovu aplikaciju Spring Boot, automatski će skenirati komponente u trenutnom paketu i njegovim podpaketima. Tako će ih registrirati u proljetnom kontekstu prijave i omogućiti nam ubrizgavanje graha @Autowired.

3. Korištenje @Autowired

Nakon omogućavanja ubrizgavanja napomena, možemo koristiti automatsko povezivanje svojstava, postavljača i konstruktora.

3.1. @Autowired na Svojstva

Pogledajmo kako možemo bilježiti svojstvo pomoću @Autowired. Ovo eliminira potrebu za geterima i postavljačima.

Prvo, definirajmo a fooFormatter grah:

@Component ("fooFormatter") javna klasa FooFormatter {javni format niza () {return "foo"; }}

Zatim ćemo ubrizgati ovaj grah u FooService grah koristeći @Autowired na definiciji polja:

@Component javna klasa FooService {@Autowired private FooFormatter fooFormatter; }

Kao rezultat, Spring ubrizgava fooFormatter kada FooService je stvorena.

3.2. @Autowired na Setterima

Pokušajmo sada dodati @Autowired bilješka na metodi postavljača.

U sljedećem primjeru, metoda postavljača poziva se s instancom FooFormatter kada FooService je stvoreno:

javna klasa FooService {private FooFormatter fooFormatter; @Autowired javna praznina setFooFormatter (FooFormatter fooFormatter) {this.fooFormatter = fooFormatter; }} 

3.3. @Autowired na Konstruktorima

Napokon, poslužimo se @Autowired na konstruktoru.

Vidjet ćemo da je primjerak FooFormatter je ubrizgalo Spring kao argument za FooService konstruktor:

javna klasa FooService {private FooFormatter fooFormatter; @Autowired javna FooService (FooFormatter fooFormatter) {this.fooFormatter = fooFormatter; }}

4. @Autowired i neobavezne ovisnosti

Kada se gradi grah, @Autowired ovisnosti trebaju biti dostupne. Inače, ako Spring ne može riješiti grah za ožičenje, izbacit će iznimku.

Slijedom toga, sprječava da se spremnik Spring uspješno pokrene, osim obrasca:

Uzrok: org.springframework.beans.factory.NoSuchBeanDefinitionException: Nije pronađen kvalificirani grah tipa [com.autowire.sample.FooDAO] za ovisnost: očekuje se najmanje 1 grah koji se kvalificira kao kandidat autožiča za ovu ovisnost. Bilješke o ovisnosti: {@ org.springframework.beans.factory.annotation.Autowired (obavezno = true)}

Da bismo to popravili, moramo deklarirati grah potrebne vrste:

javna klasa FooService {@Autowired (potrebno = netačno) private FooDAO dataAccessor; }

5. Automatska višeznačna odrednica

Prema zadanim postavkama, Spring rješava @Autowired unosi prema vrsti. Ako je u spremniku dostupno više zrna iste vrste, okvir će izbaciti fatalnu iznimku.

Da bismo riješili ovaj sukob, Springu moramo izričito reći koji grah želimo ubrizgati.

5.1. Automatsko ožičenje putem @Kvalifikator

Na primjer, pogledajmo kako možemo koristiti @Kvalifikator napomena koja označava traženi grah.

Prvo ćemo definirati 2 graha tipa Formatter:

@Component ("fooFormatter") javna klasa FooFormatter implementira Formatter {format javnog niza () {return "foo"; }}
@Component ("barFormatter") javna klasa BarFormatter implementira Formatter {format javnog niza () {return "bar"; }}

Pokušajmo sada ubrizgati a Formatter grah u FooService razred:

javna klasa FooService {@Autowired private Formatter formatter; }

U našem primjeru postoje dvije konkretne implementacije Formatter dostupno za proljetni spremnik. Kao rezultat, Proljeće će baciti a NoUniqueBeanDefinitionException iznimka pri konstrukciji FooService:

Uzrok: org.springframework.beans.factory.NoUniqueBeanDefinitionException: Nije definiran kvalificirajući grah tipa [com.autowire.sample.Formatter]: očekuje se jedan odgovarajući grah, ali pronađen 2: barFormatter, fooFormatter 

To možemo izbjeći sužavanjem provedbe pomoću a @Kvalifikator napomena:

javna klasa FooService {@Autowired @Qualifier ("fooFormatter") private Formatter formatter; }

Kada postoji više graha iste vrste, dobra je ideja koristiti @Kvalifikator kako bi se izbjegla dvosmislenost.

Napominjemo da vrijednost @Kvalifikator napomena se podudara s imenom deklariranim u @Komponenta napomena našeg FooFormatter provedba.

5.2. Automatsko ožičenje pomoću prilagođenog kvalifikatora

Proljeće nam također omogućava stvorimo vlastiti običaj @Kvalifikator bilješka. Da bismo to učinili, trebali bismo pružiti @Kvalifikator napomena s definicijom:

@Qualifier @Target ({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER}) @Retention (RetentionPolicy.RUNTIME) public @interface FormatterType {String value (); }

Tada možemo koristiti FormatterType unutar različitih implementacija za specificiranje prilagođene vrijednosti:

@FormatterType ("Foo") @Component javna klasa FooFormatter implementira Formatter {public String format () {return "foo"; }}
@FormatterType ("Bar") @Component javna klasa BarFormatter implementira Formatter {public String format () {return "bar"; }}

Konačno, naša prilagođena napomena Qualifier spremna je za upotrebu za automatsko povezivanje:

@Component javna klasa FooService {@Autowired @FormatterType ("Foo") private Formatter formatter; } 

Vrijednost navedena u @Cilj meta-anotacija ograničava gdje primijeniti kvalifikator, što su u našem primjeru polja, metode, vrste i parametri.

5.3. Automatsko povezivanje imenom

Spring koristi ime graha kao zadanu vrijednost kvalifikatora. Pregledat će spremnik i potražiti grah s točnim nazivom kao svojstvo da ga automatski poveže.

Stoga se u našem primjeru Spring podudara s fooFormatter ime svojstva na FooFormatter provedba. Stoga ubrizgava tu specifičnu implementaciju prilikom konstrukcije FooService:

javna klasa FooService {@Autowired private Formatter fooFormatter; }

6. Zaključak

U ovom smo članku razgovarali o automatskom ožičenju i različitim načinima njegove upotrebe. Također smo ispitali načine kako riješiti dvije uobičajene iznimke automatskog povezivanja uzrokovane nedostatkom zrna ili dvosmislenom injekcijom zrna.

Izvorni kôd ovog članka dostupan je na projektu GitHub.