Ú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: 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: 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. 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: Akkor használhatjuk a FormatterType különféle megvalósításokon belül egyéni érték megadásához: Végül pedig az egyéni Qualifier kommentárunk készen áll az automatikus vezetékezésre: 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. 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: 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.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
nyilvános osztályú FooService {@Autowired @Qualifier ("fooFormatter") privát formázó formázó; }
5.2. Autowiring by Custom Qualifier
@Qualifier @Target ({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER}) @Retention (RetentionPolicy.RUNTIME) public @interface FormatterType {String value (); }
@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"; }}
@ Component public class FooService {@Autowired @FormatterType ("Foo") private Formatter formatter; }
5.3. Névvel történő automatikus elküldés
nyilvános osztályú FooService {@Autowired private Formatter fooFormatter; }
6. Következtetés