Sprievodca jarom @Autowired
1. Prehľad
Počnúc jarom 2.5 zaviedol rámec anotácie Injekcia závislostí. Hlavná anotácia tejto funkcie je @Autowired.Umožňuje spoločnosti Spring vyriešiť a vstreknúť spolupracujúce fazule do našej fazule.
V tomto výučbe sa najskôr pozrieme na to, ako povoliť automatické zapojenie arôznespôsoby autowire fazule. Potom si povieme riešenie konfliktov fazule pomocou @Qualifier anotácia, ako aj možné scenáre výnimiek.
2. Povolenie @Autowired Anotácie
Rámec Spring umožňuje automatické vkladanie závislostí. Inými slovami, vyhlásením všetkých závislostí fazule v konfiguračnom súbore Spring môže kontajner Spring automaticky nadviazať vzťahy medzi spolupracujúcimi fazuľami. Toto sa volá Automatické zapojenie jarných bôbov.
Ak chcete v našej aplikácii použiť konfiguráciu založenú na prostredí Java, povoľme vstrekovanie založené na anotáciáchnačítať našu jarnú konfiguráciu:
@Configuration @ComponentScan ("com.baeldung.autowire.sample") verejná trieda AppConfig {}
Prípadne anotácia sa používa hlavne na aktiváciu anotácií vkladania závislostí v súboroch Spring XML.
Navyše, Spring Boot predstavuje @SpringBootApplication anotácia. Táto jediná anotácia je ekvivalentná použitiu @ Konfigurácia, @EnableAutoConfigurationa @ComponentScan.
Použime túto anotáciu v hlavnej triede aplikácie:
@SpringBootApplication trieda VehicleFactoryApplication {public static void main (String [] args) {SpringApplication.run (VehicleFactoryApplication.class, args); }}
Výsledkom je, že keď spustíme túto aplikáciu Spring Boot, automaticky prehľadá komponenty aktuálneho balíka a jeho čiastkových balíkov. Zaregistruje ich teda v aplikačnom kontexte jari a umožní nám vstreknúť fazuľu pomocou @Autowired.
3. Používanie @Autowired
Po povolení vloženia anotácie môžeme použiť automatické zapojenie na vlastnosti, nastavovače a konštruktory.
3.1. @Autowired na Vlastnosti
Pozrime sa, ako môžeme anotovať vlastníctvo pomocou @Autowired. To vylučuje potrebu getrov a setterov.
Najskôr definujme a fooFormatter fazuľa:
@Component ("fooFormatter") verejná trieda FooFormatter {public String format () {return "foo"; }}
Potom túto fazuľu vpichneme do FooService fazuľa pomocou @Autowired na definíciu poľa:
@ Komponenta verejná trieda FooService {@Autowired súkromný FooFormatter fooFormatter; }
Výsledkom je, že Spring vstrekuje fooFormatter kedy FooService je vytvorený.
3.2. @Autowired na stavačov
Teraz skúsme pridať @Autowired anotácia k metóde setter.
V nasledujúcom príklade sa metóda setter nazýva inštanciou FooFormatter kedy FooService je vytvorené:
public class FooService {private FooFormatter fooFormatter; @Autowired public void setFooFormatter (FooFormatter fooFormatter) {this.fooFormatter = fooFormatter; }}
3.3. @Autowired o konštruktéroch
Nakoniec použijeme @Autowired na konštruktéra.
Uvidíme, že príklad FooFormatter je vložený Spring ako argument pre FooService konštruktér:
public class FooService {private FooFormatter fooFormatter; @Autowired public FooService (FooFormatter fooFormatter) {this.fooFormatter = fooFormatter; }}
4. @Autowired a voliteľné závislosti
Keď sa fazuľa stavia, @Autowired závislosti by mali byť k dispozícii. Inak, ak Spring nedokáže vyriešiť fazuľu na zapojenie, urobí výnimku.
Následne zabráni úspešnému spusteniu kontajnera Spring s výnimkou formulára:
Spôsobené: org.springframework.beans.factory.NoSuchBeanDefinitionException: Pre závislosť sa nenašiel žiadny kvalifikačný fazuľa typu [com.autowire.sample.FooDAO]: očakáva sa minimálne 1 fazuľa, ktorá sa kvalifikuje ako kandidát autowire pre túto závislosť. Poznámky k závislosti: {@ org.springframework.beans.factory.annotation.Autowired (required = true)}
Aby sme to napravili, musíme deklarovať fazuľu požadovaného typu:
public class FooService {@Autowired (required = false) private FooDAO dataAccessor; }
5. Disambiguácia autowire
Štandardne je jar vyriešená @Autowired záznamy podľa typu. Ak je v kontajneri k dispozícii viac ako jedna fazuľa rovnakého typu, rámec vyvolá fatálnu výnimku.
Aby sme tento konflikt vyriešili, musíme Springovi výslovne povedať, do ktorej fazule chceme dať injekciu.
5.1. Automatické zapojenie @Qualifier
Pozrime sa napríklad, ako môžeme použiť @Qualifier anotácia označujúca požadovaný fazuľa.
Najskôr definujeme 2 fazule typu Formátovač:
@Component ("fooFormatter") verejná trieda FooFormatter implementuje Formatter {public String format () {return "foo"; }}
@Component ("barFormatter") verejná trieda BarFormatter implementuje Formatter {public String format () {return "bar"; }}
Teraz sa pokúsime podať injekciu a Formátovač fazuľa do FooService trieda:
public class FooService {@Autowired private Formatter formatter; }
V našom príklade existujú dve konkrétne implementácie Formátovač k dispozícii pre nádobu Spring. Ako výsledok, Jar bude hádzať a NoUniqueBeanDefinitionException výnimkou pri stavbe FooService: Tomu sa môžeme vyhnúť zúžením implementácie pomocou a @Qualifier anotácia: Ak existuje viac fazúľ rovnakého typu, je to dobrý nápad použitie @Qualifier aby sa predišlo nejasnostiam. Upozorňujeme, že hodnota @Qualifier anotácia sa zhoduje s menom deklarovaným v @ Komponent anotácia našej FooFormatter implementácia. Aj jar nám to umožňuje vytvorte si svoj vlastný zvyk @Qualifier anotácia. Aby sme to dosiahli, mali by sme poskytnúť @Qualifier anotácia s definíciou: Potom môžeme použiť FormatterType v rámci rôznych implementácií určiť vlastnú hodnotu: Nakoniec je naša vlastná anotácia Qualifier pripravená na použitie pre automatické zapojenie: Hodnota uvedená v @ Cieľ meta-anotácia obmedzuje použitie kvalifikátora, čo v našom príklade sú polia, metódy, typy a parametre. Jar používa názov fazule ako predvolenú hodnotu kvalifikátora. Skontroluje nádobu a vyhľadá fazuľu s presným názvom ako vlastnosť, ktorá ju umožní autowire. Preto sa v našom príklade Jar zhoduje s fooFormatter názov nehnuteľnosti do FooFormatter implementácia. Preto pri výstavbe vkladá túto konkrétnu implementáciu FooService: V tomto článku sme diskutovali o automatickom zapojení a rôznych spôsoboch jeho použitia. Skúmali sme tiež spôsoby, ako vyriešiť dve bežné výnimky automatického napájania spôsobené buď chýbajúcou fazuľou, alebo nejednoznačnou injekciou fazule. Zdrojový kód tohto článku je k dispozícii v projekte GitHub.Spôsobené: org.springframework.beans.factory.NoUniqueBeanDefinitionException: Nie je definovaný žiadny kvalifikačný fazuľa typu [com.autowire.sample.Formatter]: očakáva sa jeden vyhovujúci fazuľa, ale našiel sa 2: barFormatter, fooFormatter
public class FooService {@Autowired @Qualifier ("fooFormatter") private Formatter formatter; }
5.2. Autowiring podľa vlastného kvalifikátora
@Qualifier @Target ({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER}) @Retention (RetentionPolicy.RUNTIME) public @interface FormatterType {String value (); }
@FormatterType ("Foo") @Component verejná trieda FooFormatter implementuje Formatter {public String format () {return "foo"; }}
@FormatterType ("Bar") @Component verejná trieda BarFormatter implementuje Formatter {public String format () {return "bar"; }}
@Component public class FooService {@Autowired @FormatterType ("Foo") private Formatter formatter; }
5.3. Autowiring podľa názvu
verejná trieda FooService {@Autowired private Formatter fooFormatter; }
6. Záver