Zapojenie na jar: @Autowired, @Resource a @Inject

1. Prehľad

Tento článok o jarnom rámci predvedie použitie anotácií týkajúcich sa vkladania závislostí, konkrétne @ Zdroj, @Injecta @Autowired anotácie. Tieto anotácie poskytujú triedam deklaratívny spôsob riešenia závislostí. Napríklad:

@Autowired ArbitraryClass arbObject;

na rozdiel od ich okamžitej inštancie (imperatívny spôsob), napríklad:

ArbitraryClass arbObject = nový ArbitraryClass ();

Dve z troch anotácií patria do balíka rozšírení Java: javax.annotation.Resource a javax.inject.Inject. The @Autowired anotácia patrí k org.springframework.beans.factory.anotácia balíček.

Každá z týchto anotácií môže vyriešiť závislosti buď pomocou injekcie do poľa, alebo pomocou injektora setra. Zjednodušený, ale praktický príklad sa použije na demonštráciu rozdielu medzi tromi anotáciami na základe spôsobov vykonania každej anotácie.

Príklady sa zamerajú na to, ako používať tri injekčné anotácie počas integračného testovania. Závislosť požadovaná testom môže byť buď ľubovoľný súbor, alebo ľubovoľná trieda.

2. The @ Zdroj Apoznámka

The @ Zdroj anotácia je súčasťou zbierky anotácií JSR-250 a je balená s Jakarta EE. Táto anotácia má nasledujúce cesty vykonania, zoradené podľa priority:

  1. Zhoda podľa mena
  2. Zhoda podľa typu
  3. Zápas podľa kvalifikácie

Tieto cesty vykonania sú použiteľné pre vkladač aj vkladanie poľa.

2.1. Vstrekovanie do terénu

Riešenie závislostí vložením poľa sa dosiahne anotovaním inštančnej premennej pomocou @ Zdroj anotácia.

2.1.1. Zhoda podľa mena

Test integrácie, ktorý sa používa na demonštráciu vloženia poľa typu zápas podľa mena, je uvedený takto:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestResourceNameType.class) verejná trieda FieldResourceInjectionIntegrationTest {@Resource (name = "namedFile") @Test public void givenResourceAnnotation_WhenOnField_ThenDependencyValid () {assertNotNull (defaultFile); assertEquals ("namedFile.txt", defaultFile.getName ()); }}

Poďme si prejsť kódom. V FieldResourceInjectionTest integračný test, na riadku 7 sa rozlíšenie závislosti podľa mena dosiahne odovzdaním názvu fazule ako hodnoty atribútu do @ Zdroj anotácia:

@Resource (name = "namedFile") súkromný súbor defaultFile;

Táto konfigurácia vyrieši závislosti pomocou cesty vykonania zhody podľa názvu. Fazuľa namedFile musia byť definované v ApplicationContextTestResourceNameType kontext aplikácie.

Upozorňujeme, že ID fazule a zodpovedajúca hodnota referenčného atribútu sa musia zhodovať:

@Configuration verejná trieda ApplicationContextTestResourceNameType {@Bean (name = "namedFile") verejný súbor namedFile () {File namedFile = nový súbor ("namedFile.txt"); návrat pomenovanýSúbor; }}

Ak nedefinujete fazuľu v kontexte aplikácie, bude to mať za následok a org.springframework.beans.factory.NoSuchBeanDefinitionException byť vyhodený. To sa dá preukázať zmenou hodnoty atribútu odovzdanej do súboru @Bean anotácia, v ApplicationContextTestResourceNameType kontext aplikácie; alebo zmena hodnoty atribútu odovzdaného do @ Zdroj anotácia, v FieldResourceInjectionTest integračný test.

2.1.2. Zhoda podľa typu

Ak chcete demonštrovať cestu vykonania zhody podľa typu, stačí odstrániť hodnotu atribútu na riadku 7 súboru FieldResourceInjectionTest integračný test tak, aby vyzeral takto:

@ Zdroj súkromného súboru defaultFile;

a znova spustiť test.

Test bude stále úspešný, pretože ak @ Zdroj anotácia nedostane ako hodnotu atribútu názov fazule, jarný rámec bude pokračovať s ďalšou prioritou, zhodou podľa typu, aby sa pokúsil vyriešiť závislosť.

2.1.3. Zápas podľa kvalifikácie

Na demonštráciu cesty vykonania zhody podľa kvalifikátora sa scenár testovania integrácie upraví tak, aby boli v serveri definované dve fazule ApplicationContextTestResourceQualifier kontext aplikácie:

@Configuration verejná trieda ApplicationContextTestResourceQualifier {@Bean (name = "defaultFile") verejný súbor defaultFile () {File defaultFile = nový súbor ("defaultFile.txt"); vrátiť defaultFile; } @Bean (name = "namedFile") public File namedFile () {File namedFile = new File ("namedFile.txt"); návrat pomenovanýSúbor; }}

The QualifierResourceInjectionTest integračný test sa použije na preukázanie rozlíšenia závislosti zápas od kvalifikátora. V tomto scenári je do každej referenčnej premennej potrebné vložiť konkrétnu závislosť od fazule:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestResourceQualifier.class) verejná trieda QualifierResourceInjectionIntegrationTest {@Resource závislosť súkromného súboru1; @Závislosť súkromného súboru @ Zdroj2; @Test public void givenResourceAnnotation_WhenField_ThenDependency1Valid () {assertNotNull (dependency1); assertEquals ("defaultFile.txt", dependency1.getName ()); } @Test public void givenResourceQualifier_WhenField_ThenDependency2Valid () {assertNotNull (dependency2); assertEquals ("namedFile.txt", dependency2.getName ()); }}

Spustite test integrácie a org.springframework.beans.factory.NoUniqueBeanDefinitionException je hodená. Táto výnimka je vyvolaná, pretože kontext aplikácie našiel dve definície typu bean typu Súbora je zmätené, ktorá fazuľa by mala závislosť vyriešiť.

Ak chcete vyriešiť tento problém, pozrite si riadok 7 až 10 riadku QualifierResourceInjectionTest integračný test:

@Závislosť súkromného súboru @ Zdroj1; @Závislosť súkromného súboru @ Zdroj2;

a pridajte nasledujúce riadky kódu:

@Qualifier ("defaultFile") @Qualifier ("namedFile")

takže blok kódu vyzerá takto:

@Resource @Qualifier ("defaultFile") závislosť súkromného súboru1; @Resource @Qualifier ("namedFile") závislosť súkromného súboru2;

Spustite test integrácie znova, tentoraz by mal prejsť. Cieľom tohto testu bolo preukázať, že aj keď je v kontexte aplikácie definovaných viac fazúľ, hodnota @Qualifier anotácia odstráni akýkoľvek zmätok tým, že umožní vloženie konkrétnych závislostí do triedy.

2.2. Nastavovač vstrekovania

Cesty vykonania, ktoré sa uskutočnia pri vložení závislostí do poľa, sú použiteľné pre vstrekovanie založené na nastavovači.

2.2.1. Zhoda podľa mena

Rozdiel je iba v MethodResourceInjectionTest integračný test má nastavovaciu metódu:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestResourceNameType.class) verejná trieda MethodResourceInjectionIntegrationTest {súkromný súbor defaultFile; @Resource (name = "namedFile") chránený void setDefaultFile (súbor defaultFile) {this.defaultFile = defaultFile; } @Test public void givenResourceAnnotation_WhenSetter_ThenDependencyValid () {assertNotNull (defaultFile); assertEquals ("namedFile.txt", defaultFile.getName ()); }}

Riešenie závislostí vkladaním nastavovača sa vykonáva anotovaním príslušnej metódy nastavovača referenčnej premennej. Názov závislosti fazule odovzdajte ako hodnotu atribútu @ Zdroj anotácia:

súkromný súbor defaultFile; @Resource (name = "namedFile") chránený void setDefaultFile (súbor defaultFile) {this.defaultFile = defaultFile; }

The namedFile v tomto príklade sa znova použije závislosť od fazule. Názov fazule a zodpovedajúca hodnota atribútu sa musia zhodovať.

Spustite test integrácie tak, ako je, a bude úspešný.

Ak chcete vidieť, že závislosť bola skutočne vyriešená cestou vykonania zhody podľa názvu, zmeňte hodnotu atribútu odovzdanú do @ Zdroj anotáciu k hodnote podľa vášho výberu a znovu spustiť test. Tentokrát test zlyhá s a NoSuchBeanDefinitionException.

2.2.2. Zhoda podľa typu

Na demonštráciu vykonávania podľa typu setera podľa typu použijeme MethodByTypeResourceTest integračný test:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestResourceNameType.class) verejná trieda MethodByTypeResourceIntegrationTest {súkromný súbor defaultFile; @Resource protected void setDefaultFile (súbor defaultFile) {this.defaultFile = defaultFile; } @Test public void givenResourceAnnotation_WhenSetter_ThenValidDependency () {assertNotNull (defaultFile); assertEquals ("namedFile.txt", defaultFile.getName ()); }}

Spustite tento test tak, ako je, a bude úspešný.

S cieľom overiť, či Súbor závislosť bola skutočne vyriešená cestou vykonania zápasu podľa typu, zmeňte typ triedy súboru defaultFile premenná na iný typ triedy ako String. Vykonajte MethodByTypeResourceTest test integrácie znova a tentokrát a NoSuchBeanDefinitionException bude vyhodený.

Výnimka overuje, či sa na vyriešenie problému skutočne použil typ zhody Súbor závislosť. The NoSuchBeanDefinitionException potvrdzuje, že názov referenčnej premennej sa nemusí zhodovať s názvom fazule. Namiesto toho závisí závislosť od typu triedy fazule, ktorý sa zhoduje s typom triedy referenčnej premennej.

2.2.3. Zápas podľa kvalifikácie

The MethodByQualifierResourceTest integračný test sa použije na preukázanie cesty vykonania zápasu podľa kvalifikátora:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestResourceQualifier.class) verejná trieda MethodByQualifierResourceIntegrationTest {súkromný súbor arbDependency; súkromný súbor anotherArbDependency; @Test public void givenResourceQualifier_WhenSetter_ThenValidDependencies () {assertNotNull (arbDependency); assertEquals ("namedFile.txt", arbDependency.getName ()); assertNotNull (anotherArbDependency); assertEquals ("defaultFile.txt", anotherArbDependency.getName ()); } @Resource @Qualifier ("namedFile") public void setArbDependency (File arbDependency) {this.arbDependency = arbDependency; } @Resource @Qualifier ("defaultFile") public void setAnotherArbDependency (súbor inýArbDependency) {this.anotherArbDependency = anotherArbDependency; }}

Cieľom tohto testu je preukázať, že aj keď je v kontexte aplikácie definovaných viac implementácií typu bean konkrétneho typu, a @Qualifier anotáciu je možné použiť spolu s @ Zdroj anotácia na vyriešenie závislosti.

Podobne ako pri vkladaní závislostí založených na poli, ak je v kontexte aplikácie definovaných viac fazúľ, a NoUniqueBeanDefinitionException je hodená ak nie @Qualifier anotácia sa používa na určenie, ktorá fazuľa sa má použiť na riešenie závislostí.

3. The @Inject Anotácia

The @Inject anotácia patrí do zbierky anotácií JSR-330. Táto anotácia má nasledujúce cesty vykonania, zoradené podľa priority:

  1. Zhoda podľa typu
  2. Zápas podľa kvalifikácie
  3. Zhoda podľa mena

Tieto cesty vykonania sú použiteľné pre vkladač aj vkladanie poľa. Za účelom prístupu k @Inject anotácia javax.inject knižnica musí byť deklarovaná ako závislosť Gradle alebo Maven.

Pre Gradle:

testCompile group: 'javax.inject', name: 'javax.inject', version: '1'

Pre Maven:

 javax.inject javax.inject 1 

3.1. Vstrekovanie do terénu

3.1.1. Zhoda podľa typu

Príklad integračného testu bude upravený tak, aby používal iný typ závislosti, konkrétne Ľubovoľná závislosť trieda. The Ľubovoľná závislosť triedna závislosť slúži iba ako jednoduchá závislosť a nemá ďalší význam. Je uvedený v zozname takto:

@ Komponenta verejná trieda ArbitraryDependency {private final String label = "Libovolná závislosť"; public String toString () {návratový štítok; }}

The FieldInjectTest predmetný test integrácie je uvedený takto:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestInjectType.class) verejná trieda FieldInjectIntegrationTest {@Inject private ArbitraryDependency fieldInjectDependency; @Test public void givenInjectAnnotation_WhenOnField_ThenValidDependency () {assertNotNull (fieldInjectDependency); assertEquals ("Ľubovoľná závislosť", fieldInjectDependency.toString ()); }}

Na rozdiel od @ Zdroj anotácia, ktorá najskôr rieši závislosti podľa názvu; predvolené správanie @Inject anotácia rieši závislosti podľa typu.

To znamená, že aj keď sa názov premennej odkazu na triedu líši od názvu fazule, závislosť bude stále vyriešená za predpokladu, že fazuľa je definovaná v kontexte aplikácie. Všimnite si, ako názov referenčnej premennej v nasledujúcom teste:

@Inject private ArbitraryDependency fieldInjectDependency;

sa líši od názvu fazule nakonfigurovaného v kontexte aplikácie:

@Bean public ArbitraryDependency injectDependency () {ArbitraryDependency injectDependency = nový ArbitraryDependency (); return injectDependency; }

a keď je test vykonaný, je schopný vyriešiť závislosť.

3.1.2. Zápas podľa kvalifikácie

Čo však v prípade, že existuje viac implementácií konkrétneho typu triedy a určitá trieda vyžaduje konkrétnu fazuľu? Upravme príklad integračného testovania tak, aby sa vyžadovala iná závislosť.

V tomto príklade podtriedime Ľubovoľná závislosť triedy, ktorá sa používa v príklade zhody podľa typu, na vytvorenie súboru AnotherArbitraryDependency trieda:

public class AnotherArbitraryDependency extends ArbitraryDependency {private final String label = "Another Arbitrary Dependency"; public String toString () {návratový štítok; }}

Cieľom každého testovacieho prípadu je zabezpečiť, aby bola každá závislosť vložená správne do každej referenčnej premennej:

@Inject private ArbitraryDependency defaultDependency; @Inject private ArbitraryDependency namedDependency;

The FieldQualifierInjectTest integračný test používaný na preukázanie zhody kvalifikátorom je uvedený takto:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestInjectQualifier.class) verejná trieda FieldQualifierInjectIntegrationTest {@Inject private ArbitraryDependency defaultDependency; @Inject private ArbitraryDependency namedDependency; @Test public void givenInjectQualifier_WhenOnField_ThenDefaultFileValid () {assertNotNull (defaultDependency); assertEquals ("Ľubovoľná závislosť", defaultDependency.toString ()); } @Test public void givenInjectQualifier_WhenOnField_ThenNamedFileValid () {assertNotNull (defaultDependency); assertEquals ("Ďalšia svojvoľná závislosť", namedDependency.toString ()); }}

Ak existuje viac implementácií konkrétnej triedy v kontexte aplikácie a FieldQualifierInjectTest integračný test sa pokúša vložiť závislosti spôsobom uvedeným nižšie:

@Inject private ArbitraryDependency defaultDependency; @Inject private ArbitraryDependency namedDependency;

a NoUniqueBeanDefinitionException bude vyhodený.

Odhodenie tejto výnimky predstavuje spôsob jarného rámca, ktorý poukazuje na to, že existuje viac implementácií určitej triedy a je nejasné, ktorú z nich použiť. S cieľom objasniť zmätok choďte na riadok 7 a 10 FieldQualifierInjectTest integračný test:

@Inject private ArbitraryDependency defaultDependency; @Inject private ArbitraryDependency namedDependency;

odovzdať požadovaný názov fazule @Qualifier anotácia, ktorá sa používa spolu s @Inject anotácia. Blok kódu bude teraz vyzerať takto:

@Inject @Qualifier ("defaultFile") súkromná ArbitraryDependency defaultDependency; @Inject @Qualifier ("namedFile") súkromná ArbitraryDependency namedDependency;

The @Qualifier anotácia očakáva prísnu zhodu pri prijímaní názvu fazule. Zaistite, aby bol názov fazule odovzdaný Kvalifikátor správne, inak, a NoUniqueBeanDefinitionException bude vyhodený. Spustite test znova a tentoraz by mal prejsť.

3.1.3. Zhoda podľa mena

The FieldByNameInjectTest integračný test používaný na preukázanie zhody podľa názvu je podobný ako pri ceste vykonania zhody podľa typu. Jediný rozdiel je v tom, že teraz sa vyžaduje konkrétna fazuľa, na rozdiel od konkrétneho typu. V tomto príklade podtriedime Ľubovoľná závislosť triedy opäť na výrobu YetAnotherArbitraryDependency trieda:

public class YetAnotherArbitraryDependency rozširuje ArbitraryDependency {private final String label = "Yet Another Libovolná závislosť"; public String toString () {návratový štítok; }}

Na demonštráciu cesty vykonania zhody podľa názvu použijeme nasledujúci test integrácie:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestInjectName.class) verejná trieda FieldByNameInjectIntegrationTest {@Inject @Named ("yetAnotherFieldInject") @Test public void givenInjectQualifier_WhenSetOnField_ThenDependencyValid () {assertNotNull (yetAnotherFieldInjectDependency); assertEquals ("Ešte jedna ľubovoľná závislosť", yetAnotherFieldInjectDependency.toString ()); }}

Kontext aplikácie je uvedený takto:

@ Konfigurácia verejnej triedy ApplicationContextTestInjectName {@Bean public ArbitraryDependency yetAnotherFieldInjectDependency () {ArbitraryDependency yetAnotherFieldInjectDependency = new YetAnotherArbitraryDependency (); return yetAnotherFieldInjectDependency; }}

Spustite test integrácie tak, ako je, a bude úspešný.

Ak chcete overiť, či bola závislosť skutočne vložená cestou vykonania zhody podľa názvu, zmeňte hodnotu, yetAnotherFieldInjectDependency, ktorý bol odovzdaný do @ Menovaný anotáciu k inému názvu podľa vášho výberu. Spustite test znova - tentokrát, a NoSuchBeanDefinitionException je hodená.

3.2. Nastavovač vstrekovania

Nastavovač injekcie pre @Inject anotácia je podobná použitému prístupu @ Zdroj vstrekovač na báze nastavovača. Namiesto anotácie referenčnej premennej sa anotuje zodpovedajúca metóda settera. Cesty vykonávania, po ktorých nasleduje injekcia závislostí založených na poli, sa vzťahujú aj na injekcie založené na nastavovači.

4. The @Autowired Anotácia

Správanie @Autowired anotácia je podobná @Inject anotácia. Rozdiel je iba v tom, že @Autowired anotácia je súčasťou jarného rámca. Táto anotácia má rovnaké cesty vykonania ako @Inject anotácia uvedená v poradí podľa priority:

  1. Zhoda podľa typu
  2. Zápas podľa kvalifikácie
  3. Zhoda podľa mena

Tieto cesty vykonania sú použiteľné pre vkladač aj vkladanie poľa.

4.1. Vstrekovanie do terénu

4.1.1. Zhoda podľa typu

Príklad integračného testovania použitý na preukázanie @Autowired cesta vykonania zhody podľa typu bude podobná testu použitému na preukázanie @Inject cesta vykonania zápasu podľa typu. The FieldAutowiredTest integračný test používaný na preukázanie zhody podľa typu pomocou @Autowired anotácia je uvedená takto:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestAutowiredType.class) verejná trieda FieldAutowiredIntegrationTest {@Autowired private ArbitraryDependency fieldDependency; @Test public void givenAutowired_WhenSetOnField_ThenDependencyResolved () {assertNotNull (fieldDependency); assertEquals ("Ľubovoľná závislosť", fieldDependency.toString ()); }}

Kontext aplikácie pre tento test integrácie je uvedený takto:

@Configuration verejná trieda ApplicationContextTestAutowiredType {@Bean public ArbitraryDependency autowiredFieldDependency () {ArbitraryDependency autowiredFieldDependency = nový ArbitraryDependency (); návrat autowiredFieldDependency; }}

Cieľom integračného testu je preukázať, že zhoda podľa typu má prednosť pred ostatnými cestami vykonania. Oznámenie na riadku 8 FieldAutowiredTest integračný test, ako názov referenčnej premennej:

@Autowired private ArbitraryDependency fieldDependency;

sa líši od názvu fazule v kontexte aplikácie:

@Bean public ArbitraryDependency autowiredFieldDependency () {ArbitraryDependency autowiredFieldDependency = nový ArbitraryDependency (); návrat autowiredFieldDependency; }

Po spustení testu prejde.

Zmeňte typ príkazu, aby ste potvrdili, že závislosť bola skutočne vyriešená pomocou cesty vykonania zhody podľa typu poľná závislosť referenčnú premennú a znova spustite test integrácie. Tentokrát okolo FieldAutowiredTest integračný test musí zlyhať, a NoSuchBeanDefinitionException byť vyhodený. Týmto sa overí, či sa na vyriešenie závislosti použila zhoda podľa typu.

4.1.2. Zápas podľa kvalifikácie

Čo ak by došlo k situácii, keď bolo v kontexte aplikácie definovaných viac implementácií fazule, ako je uvedená nižšie:

@Configuration verejná trieda ApplicationContextTestAutowiredQualifier {@Bean public ArbitraryDependency autowiredFieldDependency () {ArbitraryDependency autowiredFieldDependency = nová ArbitraryDependency (); návrat autowiredFieldDependency; } @Bean public ArbitraryDependency anotherAutowiredFieldDependency () {ArbitraryDependency anotherAutowiredFieldDependency = nový AnotherArbitraryDependency (); vrátiť anotherAutowiredFieldDependency; }}

Ak FieldQualifierAutowiredTest vykoná sa integračný test uvedený nižšie:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestAutowiredQualifier.class) verejná trieda FieldQualifierAutowiredIntegrationTest {@Autowired private ArbitraryDependency fieldD @Autowired private ArbitraryDependency fieldDependency2; @Test public void givenAutowiredQualifier_WhenOnField_ThenDep1Valid () {assertNotNull (fieldDependency1); assertEquals ("Ľubovoľná závislosť", fieldDependency1.toString ()); } @Test public void givenAutowiredQualifier_WhenOnField_ThenDep2Valid () {assertNotNull (fieldDependency2); assertEquals ("Ďalšia ľubovoľná závislosť", fieldDependency2.toString ()); }}

a NoUniqueBeanDefinitionException bude vyhodený.

Výnimka je spôsobená nejednoznačnosťou spôsobenou dvoma fazuľami definovanými v kontexte aplikácie. Jarný rámec nevie, ktorá závislosť na fazuli by sa mala automaticky napojiť na ktorú referenčnú premennú. Tento problém vyriešite pridaním @Qualifier poznámka k riadkom 7 a 10 FieldQualifierAutowiredTest integračný test:

@Autowired private FieldDependency fieldDependency1; @Autowired private FieldDependency fieldDependency2;

takže blok kódu vyzerá takto:

@Autowired @Qualifier ("autowiredFieldDependency") súkromná FieldDependency fieldDependency1; @Autowired @Qualifier ("anotherAutowiredFieldDependency") súkromná FieldDependency fieldDependency2;

Spustite test znova a tentokrát to prejde.

4.1.3. Zhoda podľa mena

Rovnaký scenár integračného testu sa použije na preukázanie cesty vykonania zhody podľa názvu pri použití servera @Autowired anotácia na vloženie závislosti poľa. Pri automatickom pripájaní závislostí podľa názvu @ComponentScan anotácia musí byť použitá s kontextom aplikácie, ApplicationContextTestAutowiredName:

@Configuration @ComponentScan (basePackages = {"com.baeldung.dependency"}) verejná trieda ApplicationContextTestAutowiredName {}

The @ComponentScan anotácia prehľadá balíky pre triedy Java, ktoré boli anotované pomocou @ Komponent anotácia. Napríklad v kontexte aplikácie je com.baeldung.dependency balík bude prehľadaný pre triedy, ktoré boli anotované pomocou @ Komponent anotácia. V tomto scenári musí jarný rámec zistiť Ľubovoľná závislosť triedy, ktorá má @ Komponent anotácia:

@Component (value = "autowiredFieldDependency") verejná trieda ArbitraryDependency {private final String label = "ľubovoľná závislosť"; public String toString () {návratový štítok; }}

Hodnota atribútu, autowiredFieldDependency, prešiel do @ Komponent anotácia, hovorí jarnému rámcu, že Ľubovoľná závislosť trieda je komponent s názvom autowiredFieldDependency. Za účelom @Autowired anotácia na vyriešenie závislostí podľa názvu, názov komponentu musí zodpovedať názvu poľa definovanému v FieldAutowiredNameTest integračný test; pozri riadok 8:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestAutowiredName.class) verejná trieda FieldAutowiredNameIntegrationTest {@Autowired private ArbitraryDependency autowiredFieldDirectency @Test public void givenAutowiredAnnotation_WhenOnField_ThenDepValid () {assertNotNull (autowiredFieldDependency); assertEquals ("Ľubovoľná závislosť", autowiredFieldDependency.toString ()); }}

Keď FieldAutowiredNameTest integračný test prebieha tak, ako je, prejde.

Ale ako vieme, že @Autowired anotácia skutočne vyvolala cestu vykonania zhody podľa názvu? Zmeňte názov referenčnej premennej autowiredFieldDependency na iné meno podľa vášho výberu, potom test spustite znova.

Tentokrát test zlyhá a a NoUniqueBeanDefinitionException je hodená. Podobnou kontrolou by bola zmena @ Komponent hodnota atribútu, autowiredFieldDependency, na inú hodnotu podľa vášho výberu a spustite test znova. A NoUniqueBeanDefinitionException bude tiež vyhodené.

Táto výnimka je dôkazom toho, že ak sa použije nesprávny názov fazule, nenájde sa žiadna platná fazuľa. Preto bola vyvolaná cesta vykonania zhody podľa názvu.

4.2. Nastavovač vstrekovania

Nastavovač injekcie pre @Autowired anotácia je podobná ako v prípade prístupu @ Zdroj vstrekovač na báze nastavovača. Namiesto anotácie referenčnej premennej pomocou @Inject anotácia, príslušný nastavovač je anotovaný. Cesty vykonávania, po ktorých nasleduje injekcia závislostí založených na poli, sa vzťahujú aj na injekcie založené na nastavovači.

5. Aplikácia týchto anotácií

To vyvoláva otázku, ktorá anotácia by sa mala použiť a za akých okolností? Odpoveď na tieto otázky závisí od scenára návrhu, ktorému čelí príslušná aplikácia, a od toho, ako si vývojár želá využívať polymorfizmus na základe predvolených ciest vykonávania každej anotácie.

5.1. Široké uplatnenie singletonov prostredníctvom polymorfizmu

Ak je návrh taký, že správanie aplikácie je založené na implementáciách rozhrania alebo abstraktnej triedy a tieto správania sa používajú v celej aplikácii, použite buď @Inject alebo @Autowired anotácia.

Výhodou tohto prístupu je, že pri aktualizácii aplikácie alebo pri opravení chyby je potrebné použiť opravu; potom je možné triedy vymeniť s minimálnym negatívnym dopadom na celkové správanie aplikácie. V tomto scenári je primárna predvolená cesta spustenia zhoda podľa typu.

5.2. Konfigurácia jemnozrnného správania aplikácie prostredníctvom polymorfizmu

Ak je návrh taký, že aplikácia má komplexné správanie, každé správanie je založené na rôznych rozhraniach / abstraktných triedach a použitie každej z týchto implementácií sa v jednotlivých aplikáciách líši, potom použite @ Zdroj anotácia. V tomto scenári je primárna predvolená cesta spustenia zhoda podľa názvu.

5.3. Injekcia závislostí by mala byť riešená výlučne platformou Jakarta EE

Ak existuje návrh mandátu pre všetky závislosti, ktoré majú byť vložené platformou Jakarta EE a nie Spring, potom je na výber medzi @ Zdroj anotácia a @Inject anotácia. Mali by ste zúžiť konečné rozhodnutie medzi týmito dvoma anotáciami, na základe ktorého sa vyžaduje predvolená cesta vykonania.

5.4. Injekcia závislostí by mala byť riešená výlučne jarným rámcom

Ak sa mandát bude týkať všetkých závislostí, ktoré má vybaviť jarný rámec, jedinou možnosťou je @Autowired anotácia.

5.5. Zhrnutie diskusie

Nasledujúca tabuľka sumarizuje diskusiu.

Scenár@ Zdroj@Inject@Autowired
Využitie singletonov v celom rozsahu prostredníctvom polymorfizmu
Podrobná konfigurácia správania aplikácie prostredníctvom polymorfizmu
Injekcia závislostí by mala byť riešená výhradne platformou Jakarta EE
Injekcia závislostí by mala byť riešená výlučne jarným rámcom

6. Záver

Cieľom článku bolo poskytnúť hlbší vhľad do chovania jednotlivých anotácií. Pochopenie toho, ako sa chová každá anotácia, prispeje k lepšiemu celkovému návrhu a údržbe aplikácie.

Kód použitý počas diskusie nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found