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:

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 

Tomu sa môžeme vyhnúť zúžením implementácie pomocou a @Qualifier anotácia:

public class FooService {@Autowired @Qualifier ("fooFormatter") private Formatter formatter; }

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.

5.2. Autowiring podľa vlastného kvalifikátora

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:

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

Potom môžeme použiť FormatterType v rámci rôznych implementácií určiť vlastnú hodnotu:

@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"; }}

Nakoniec je naša vlastná anotácia Qualifier pripravená na použitie pre automatické zapojenie:

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

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.

5.3. Autowiring podľa názvu

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:

verejná trieda FooService {@Autowired private Formatter fooFormatter; }

6. Záver

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.