Útmutató a tavaszhoz @Autowired

1. Áttekintés

A 2.5 tavasztól kezdve a keretrendszer annotációk által vezérelt Függőségi injekció. Ennek a szolgáltatásnak a fő megjegyzései: @Autowired.Lehetővé teszi Spring számára, hogy oldja meg az injekciót, és beadja a babot babunkba.

Ebben az oktatóanyagban először megvizsgáljuk, hogyan lehet engedélyezni az automatikus vezetést és akülönfélea babok automatikus megadásának módjai. Utána beszélünk róla babkonfliktusok megoldása @ Minősítő kommentár, valamint a lehetséges kivételes forgatókönyveket.

2. Engedélyezés @Autowired Megjegyzések

A tavaszi keret lehetővé teszi az automatikus függőség-injektálást. Más szavakkal, az összes babfüggőség deklarálásával egy Spring konfigurációs fájlban, a Spring tároló automatizálhatja az együttműködő babok közötti kapcsolatokat. Ezt úgy hívják Tavaszi bab automatikus bekötése.

Ha Java-alapú konfigurációt szeretnénk használni alkalmazásunkban, engedélyezzük az annotáció-vezérelt injekcióta rugó konfigurációnk betöltéséhez:

@Configuration @ComponentScan ("com.baeldung.autowire.sample") public class AppConfig {}

Alternatív megoldásként a az annotációt elsősorban a függőség-injektálási kommentárok aktiválására használják a tavaszi XML fájlokban.

Ráadásul, A Spring Boot bemutatja a @SpringBootApplication annotáció. Ez az egyetlen megjegyzés a használatával egyenértékű @ Konfiguráció, @EnableAutoConfiguration, és @ComponentScan.

Használjuk ezt az annotációt az alkalmazás fő osztályában:

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

Ennek eredményeként, amikor a Spring Boot alkalmazást futtatjuk, automatikusan átvizsgálja az aktuális csomag és annak alcsomagjainak összetevőit. Így regisztrálja őket a Spring alkalmazási kontextusába, és lehetővé teszi számunkra, hogy a babot injekcióval injektáljuk @Autowired.

3. Használata @Autowired

Miután engedélyezte az annotáció injekciót, használhatjuk az automatikus vezetékezést a tulajdonságokon, a szetteken és a kivitelezőkön.

3.1. @Autowired a Tulajdonságok oldalon

Lássuk, hogyan lehet egy tulajdonságot feljegyezni a használatával @Autowired. Ez kiküszöböli a szerelvények és a beállítók szükségét.

Először definiáljuk a fooFormatter bab:

@Component ("fooFormatter") public class FooFormatter {public String format () {return "foo"; }}

Ezután beadjuk ezt a babot a FooService bab felhasználásával @Autowired a terepi meghatározásról:

@Component public class FooService {@Autowired private FooFormatter fooFormatter; }

Ennek eredményeként Spring injekciót ad fooFormatter mikor FooService létrehozva.

3.2. @Autowired a Settereken

Most próbáljuk meg hozzáadni @Autowired annotáció egy szetter módszerre.

A következő példában a setter metódust a FooFormatter mikor FooService létrehozva:

nyilvános osztály FooService {private FooFormatter fooFormatter; @Autowired public void setFooFormatter (FooFormatter fooFormatter) {this.fooFormatter = fooFormatter; }} 

3.3. @Autowired a Konstruktorokon

Végül használjuk @Autowired egy kivitelezőn.

Meglátjuk, hogy FooFormatter beadja Spring érvként a FooService konstruktőr:

nyilvános osztály FooService {private FooFormatter fooFormatter; @Autowired public FooService (FooFormatter fooFormatter) {this.fooFormatter = fooFormatter; }}

4. @Autowired és Opcionális függőségek

Amikor egy babot építenek, a @Autowired függőségeknek rendelkezésre kell állniuk. Másképp, ha Spring nem tud megoldani egy babot a vezetékezésre, kivételt vet.

Következésképpen megakadályozza a Spring konténer sikeres elindítását, kivéve az alábbi formát:

Okozta: org.springframework.beans.factory.NoSuchBeanDefinitionException: Nem található [com.autowire.sample.FooDAO] típusú minősítő bab a függőségre: várhatóan legalább 1 bab, amely jogosultnak minősül ennek a függőségnek. Függőségi jelölések: {@ org.springframework.beans.factory.annotation.Autowired (kötelező = igaz)}

Ennek kijavításához be kell jelentenünk egy szükséges típusú babot:

public class FooService {@Autowired (kötelező = hamis) privát FooDAO dataAccessor; }

5. Autowire pontosítása

Alapértelmezés szerint a Spring megoldódik @Autowired bejegyzések típus szerint. Ha egynél több azonos típusú bab érhető el a tárolóban, a keret végzetes kivételt vet ki.

A konfliktus megoldásához kifejezetten meg kell mondanunk Springnek, hogy melyik babot akarjuk beadni.

5.1. Autowiring by @ Minősítő

Lássuk például, hogyan használhatjuk a @ Minősítő annotáció a szükséges bab megjelölésére.

Először meghatározunk 2 típusú babot Formázó:

@Component ("fooFormatter") public class FooFormatter implementálja a Formatter {public String format () {return "foo"; }}
@Component ("barFormatter") public class A BarFormatter megvalósítja a Formatter {public String format () {return "bar" parancsot; }}

Most próbáljuk meg beadni a Formázó babot a FooService osztály:

nyilvános osztályú FooService {@Autowired private Formatter formatter; }

Példánkban két konkrét megvalósítás létezik Formázó a tavaszi konténerhez kapható. Ennek eredményeként A tavasz eldob a NoUniqueBeanDefinitionException kivétele a FooService:

Okozta: org.springframework.beans.factory.NoUniqueBeanDefinitionException: Nincs meghatározva [com.autowire.sample.Formatter] típusú bab: várható egyetlen egyező bab, de talált 2: barFormatter, fooFormatter 

Ezt elkerülhetjük, ha az a segítségével szűkítjük a megvalósítást @ Minősítő kommentár:

nyilvános osztályú FooService {@Autowired @Qualifier ("fooFormatter") privát formázó formázó; }

Ha több azonos típusú bab van, érdemes használat @ Minősítő hogy elkerüljék a kétértelműséget.

Felhívjuk figyelmét, hogy a @ Minősítő az annotáció megegyezik a @Összetevő annotációnk FooFormatter végrehajtás.

5.2. Autowiring by Custom Qualifier

A tavasz is lehetővé teszi számunkra hozza létre saját szokásainkat @ Minősítő annotáció. Ehhez meg kell adnunk a @ Minősítő kommentár a definícióval:

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

Akkor használhatjuk a FormatterType különféle megvalósításokon belül egyéni érték megadásához:

@FormatterType ("Foo") @Component public class A FooFormatter megvalósítja a Formatter {public String format () {return "foo"; }}
@FormatterType ("Bar") @Component public class A BarFormatter megvalósítja a Formatter {public String format () {return "bar"; }}

Végül pedig az egyéni Qualifier kommentárunk készen áll az automatikus vezetékezésre:

@ Component public class FooService {@Autowired @FormatterType ("Foo") private Formatter formatter; } 

A @Cél a meta-annotáció korlátozza a minősítő alkalmazási helyét, ami példánkban mezők, módszerek, típusok és paraméterek.

5.3. Névvel történő automatikus elküldés

Spring a bab nevét használja alapértelmezett minősítő értékként. Megvizsgálja a konténert, és egy babot keres, amelynek tulajdona a pontos név.

Ezért példánkban a tavasz megfelel a fooFormatter tulajdonság neve a FooFormatter végrehajtás. Ezért a konstrukció során beadja ezt a konkrét megvalósítást FooService:

nyilvános osztályú FooService {@Autowired private Formatter fooFormatter; }

6. Következtetés

Ebben a cikkben megvitattuk az automatikus bekötést és annak használatának különféle módjait. Megvizsgáltuk azt is, hogy miként lehet megoldani két általános autowiring kivételt, amelyet vagy hiányzó bab, vagy kétértelmű babinjekció okoz.

A cikk forráskódja a GitHub projekten érhető el.