Ožičenje u proljeće: @Autowired, @Resource i @Inject

1. Pregled

Ovaj proljetni okvirni članak pokazat će upotrebu napomena povezanih s ubrizgavanjem ovisnosti, naime @Resurs, @Ubrizgati, i @Autowired bilješke. Te bilješke pružaju klasama deklarativni način rješavanja ovisnosti. Na primjer:

@Autowired ArbitraryClass arbObject;

za razliku od izravnog instanciranja (imperativni način), na primjer:

ArbitraryClass arbObject = novi ArbitraryClass ();

Dvije od tri bilješke pripadaju paketu proširenja Java: javax.notacija.Izvor i javax.injekt.Injekt. The @Autowired napomena pripada org.springframework.beans.factory.annotation paket.

Svaka od ovih bilješki može riješiti ovisnosti bilo ubrizgavanjem u polje ili ubrizgavanjem postavljača. Pojednostavljeni, ali praktični primjer koristit će se kako bi se demonstrirala razlika između tri bilješke, na temelju putova izvršenja koje je svaka napomena preuzela.

Primjeri će se usredotočiti na to kako koristiti tri napomene ubrizgavanja tijekom testiranja integracije. Ovisnost koju traži test može biti proizvoljna datoteka ili proizvoljna klasa.

2. The @Resurs Abilješka

The @Resurs napomena dio je zbirke bilješki JSR-250 i pakirana je s Jakarta EE. Ova bilješka ima sljedeće staze izvršavanja, poredane po prioritetu:

  1. Podudaranje po imenu
  2. Podudaranje po vrsti
  3. Utakmica po kvalifikacijama

Ovi putovi izvršenja primjenjivi su i na postavljač i na ubrizgavanje polja.

2.1. Ubrizgavanje polja

Rješavanje ovisnosti ubrizgavanjem polja postiže se označavanjem varijable instance s @Resurs bilješka.

2.1.1. Podudaranje po imenu

Integracijski test koji se koristi za demonstraciju ubrizgavanja polja podudaranjem po imenu naveden je kako slijedi:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestResourceNameType.class) javna klasa FieldResourceInjectionIntegrationTest {@ResourceceFileFile {@ResourceceFileFile {@ResourceceFileFile {@ResourceceFileFile {@ResourceceFileFile {@ResourceFileFileFile {@ResourceceFileFile {@ResourceFileFile; @Test javna praznina givenResourceAnnotation_WhenOnField_ThenDependencyValid () {assertNotNull (defaultFile); assertEquals ("namedFile.txt", defaultFile.getName ()); }}

Prođimo kroz kod. U FieldResourceInjectionTest integracijski test, u retku 7, razlučivost ovisnosti po imenu postiže se predavanjem naziva zrna kao vrijednosti atributa na @Resurs napomena:

@Resource (name = "namedFile") privatna datoteka defaultFile;

Ova će konfiguracija riješiti ovisnosti pomoću puta izvršenja podudaranja po imenu. Grah imenovanFile mora biti definirano u ApplicationContextTestResourceNameType kontekst aplikacije.

Imajte na umu da se ID graha i odgovarajuća vrijednost referentnog atributa moraju podudarati:

@Configuration javna klasa ApplicationContextTestResourceNameType {@Bean (name = "namedFile") javna datoteka namedFile () {Datoteka namedFile = nova datoteka ("namedFile.txt"); povratak namedFile; }}

Ako ne definirate grah u kontekstu aplikacije, rezultirat će a org.springframework.beans.factory.NoSuchBeanDefinitionException biti bačen. To se može pokazati promjenom vrijednosti atributa proslijeđene u @Grah bilješka u ApplicationContextTestResourceNameType kontekst aplikacije; ili promjena vrijednosti atributa koja je proslijeđena u @Resurs bilješka u FieldResourceInjectionTest integracijski test.

2.1.2. Podudaranje po vrsti

Da biste demonstrirali put izvršavanja podudaranja po tipu, samo uklonite vrijednost atributa u retku 7 retka FieldResourceInjectionTest integracijski test tako da izgleda ovako:

@Resource private File defaultFile;

i ponovno pokrenite test.

Test će i dalje proći jer ako @Resurs napomena ne prima ime graha kao vrijednost atributa, Spring Framework nastavit će sa sljedećom razinom prednosti, podudaranjem po tipu, kako bi pokušao riješiti ovisnost.

2.1.3. Utakmica po kvalifikacijama

Da bi se demonstrirao put izvršavanja podudaranja po kvalifikatoru, scenarij integracijskog testiranja izmijenit će se tako da u ApplicationContextTestResourceQualifier kontekst aplikacije:

@Configuration javna klasa ApplicationContextTestResourceQualifier {@Bean (name = "defaultFile") javna datoteka defaultFile () {Datoteka defaultFile = nova datoteka ("defaultFile.txt"); return defaultFile; } @Bean (name = "namedFile") javna datoteka namedFile () {Datoteka namedFile = nova datoteka ("namedFile.txt"); povratak namedFile; }}

The QualifierResourceInjectionTest integracijski test koristit će se za pokazivanje razlučivosti ovisnosti podudaranja po kvalifikatoru. U ovom scenariju, u svaku referentnu varijablu treba ubrizgati određenu ovisnost o grahu:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestResourceQualifier.class) QualifierResourceInjectionIntegrationTest private file; @Resource private File dependency2; @Test javna praznina givenResourceAnnotation_WhenField_ThenDependency1Valid () {assertNotNull (dependency1); assertEquals ("defaultFile.txt", dependency1.getName ()); } @Test javna praznina givenResourceQualifier_WhenField_ThenDependency2Valid () {assertNotNull (dependency2); assertEquals ("namedFile.txt", dependency2.getName ()); }}

Pokrenite test integracije i an org.springframework.beans.factory.NoUniqueBeanDefinitionException baca se. Ova se iznimka baca jer je kontekst aplikacije pronašao dvije definicije tipa graha Datotekai zbunjeno je koji grah treba riješiti ovisnost.

Da biste riješili ovaj problem, pogledajte redove 7 do 10 retka QualifierResourceInjectionTest integracijski test:

@Resource private File dependency1; @Resource private File dependency2;

i dodajte sljedeće retke koda:

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

tako da blok koda izgleda ovako:

@Resource @Qualifier ("defaultFile") privatna ovisnost o datoteci1; @Resource @Qualifier ("namedFile") privatna ovisnost o datoteci2;

Ponovno pokrenite test integracije, ovaj put bi trebao proći. Cilj ovog testa bio je pokazati da, čak i ako postoji više grahova definiranih u kontekstu aplikacije, @Kvalifikator anotacija uklanja svaku zbrku dopuštanjem ubrizgavanja određenih ovisnosti u klasu.

2.2. Setter Injection

Putovi izvršenja poduzeti prilikom ubrizgavanja ovisnosti na polje primjenjivi su na ubrizgavanje temeljeno na postavljaču.

2.2.1. Podudaranje po imenu

Jedina razlika je TestResourceInjectionTest integracijski test ima metodu postavljača:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestResourceNameType.class) javna klasa MethodResourceInjectionIntegrationTest {privatna datoteka defaultFile; @Resource (name = "namedFile") zaštićena praznina setDefaultFile (Datoteka defaultFile) {this.defaultFile = defaultFile; } @Test javna praznina givenResourceAnnotation_WhenSetter_ThenDependencyValid () {assertNotNull (defaultFile); assertEquals ("namedFile.txt", defaultFile.getName ()); }}

Rješavanje ovisnosti ubrizgavanjem postavljača vrši se označavanjem odgovarajuće metode postavljača referentne varijable. Proslijedite ime ovisnosti o grahu kao vrijednost atributa na @Resurs napomena:

privatna datoteka defaultFile; @Resource (name = "namedFile") zaštićena praznina setDefaultFile (Datoteka defaultFile) {this.defaultFile = defaultFile; }

The imenovanFile ovisnost o grahu će se ponovno upotrijebiti u ovom primjeru. Naziv graha i odgovarajuća vrijednost atributa moraju se podudarati.

Pokrenite test integracije kakav jest i on će proći.

Da biste vidjeli da je ovisnost zaista riješena putem izvršenja podudaranja po imenu, promijenite vrijednost atributa proslijeđenu u @Resurs bilješku na vrijednost po vašem izboru i ponovno pokrenite test. Ovaj put test neće uspjeti s a NoSuchBeanDefinitionException.

2.2.2. Podudaranje po vrsti

Da bismo demonstrirali izvršavanje na temelju postavljača, podudaranje po tipu, upotrijebit ćemo MethodByTypeResourceTest integracijski test:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestResourceNameType.class) javna klasa MethodByTypeResourceIntegrationTest {privatna datoteka defaultFile {privatna datoteka defaultFile; @Resource zaštićena void setDefaultFile (Datoteka defaultFile) {this.defaultFile = defaultFile; } @Test javna praznina givenResourceAnnotation_WhenSetter_ThenValidDependency () {assertNotNull (defaultFile); assertEquals ("namedFile.txt", defaultFile.getName ()); }}

Pokrenite ovaj test kakav je i proći će.

Da bi se potvrdilo da Datoteka ovisnost je doista riješena putem izvršavanja podudaranja po tipu, promijenite vrstu klase defaultFile varijabla na drugu vrstu klase poput Niz. Izvršite MethodByTypeResourceTest ponovno integracijski test i ovaj put a NoSuchBeanDefinitionException bit će bačen.

Iznimka potvrđuje da je podudaranje po tipu doista korišteno za rješavanje Datoteka ovisnost. The NoSuchBeanDefinitionException potvrđuje da naziv referentne varijable ne treba odgovarati imenu graha. Umjesto toga, razlučivost ovisnosti ovisi o tipu klase graha koji odgovara tipu klase referentne varijable.

2.2.3. Utakmica po kvalifikacijama

The MethodByQualifierResourceTest integracijski test koristit će se za prikaz puta izvršavanja podudaranja po kvalifikatoru:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestResourceQualifier.class) javna klasa MethodByQualifierResourceIntegrationTest {privatna datoteka; privatna datoteka anotherArbDependency; @Test javna praznina givenResourceQualifier_WhenSetter_ThenValidDependencies () {assertNotNull (arbDependency); assertEquals ("namedFile.txt", arbDependency.getName ()); assertNotNull (anotherArbDependency); assertEquals ("defaultFile.txt", anotherArbDependency.getName ()); } @Resource @Qualifier ("namedFile") javna praznina setArbDependency (datoteka arbDependency) {this.arbDependency = arbDependency; } @Resource @Qualifier ("defaultFile") javna praznina setAnotherArbDependency (Datoteka anotherArbDependency) {this.anotherArbDependency = anotherArbDependency; }}

Cilj ovog testa je pokazati da čak i ako su višestruke implementacije graha određenog tipa definirane u kontekstu aplikacije, @Kvalifikator napomena se može koristiti zajedno s @Resurs napomena za rješavanje ovisnosti.

Slično ubrizgavanju ovisnosti na terenu, ako je u kontekstu aplikacije definirano više grahova, a NoUniqueBeanDefinitionException baca se ako ne @Kvalifikator bilješka se koristi za specificiranje graha koji se koristi za rješavanje ovisnosti.

3. The @Ubrizgati Bilješka

The @Ubrizgati napomena pripada zbirci bilješki JSR-330. Ova bilješka ima sljedeće staze izvršavanja, poredane po prioritetu:

  1. Podudaranje po vrsti
  2. Utakmica po kvalifikacijama
  3. Podudaranje po imenu

Ovi putovi izvršenja primjenjivi su i na postavljač i na ubrizgavanje polja. Da biste pristupili @Ubrizgati napomena, javax.injekt knjižnica mora biti deklarirana kao ovisnost o Gradleu ili Mavenu.

Za Gradle:

testCompile grupa: 'javax.inject', naziv: 'javax.inject', verzija: '1'

Za Maven:

 javax.injekt javax.injekt 1 

3.1. Ubrizgavanje polja

3.1.1. Podudaranje po vrsti

Primjer integracijskog testa bit će izmijenjen kako bi se koristila druga vrsta ovisnosti, naime Proizvoljna ovisnost razred. The Proizvoljna ovisnost ovisnost o klasi služi samo kao jednostavna ovisnost i nema daljnjeg značaja. Navedeno je kako slijedi:

@Component javna klasa ArbitraryDependency {private final String label = "Arbitrarna ovisnost"; javni String toString () {povratna oznaka; }}

The FieldInjectTest predmetni integracijski test naveden je kako slijedi:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestInjectType.class) javna klasa FieldInjectIntegrationTest {@Inject private ArbitraryDependencyencyIndject; @Test javna praznina givenInjectAnnotation_WhenOnField_ThenValidDependency () {assertNotNull (fieldInjectDependency); assertEquals ("Proizvoljna ovisnost", fieldInjectDependency.toString ()); }}

Za razliku od @Resurs napomena koja prvo rješava ovisnosti imenom; zadano ponašanje @Ubrizgati napomena rješava ovisnosti prema tipu.

To znači da, čak i ako se naziv referentne varijable klase razlikuje od imena graha, ovisnost će i dalje biti riješena, pod uvjetom da je grah definiran u kontekstu aplikacije. Primijetite kako naziv referentne varijable u sljedećem testu:

@Inject private ArbitraryDependency fieldInjectDependency;

razlikuje se od naziva graha konfiguriranog u kontekstu aplikacije:

@Bean public ArbitraryDependency injectDependency () {ArbitraryDependency injectDependency = nova ArbitrarDependency (); vratiti injectDependency; }

a kada se test izvrši, on je u stanju riješiti ovisnost.

3.1.2. Utakmica po kvalifikacijama

Ali što ako postoji više implementacija određenog tipa klase, a određena klasa zahtijeva određeni grah? Izmijenimo primjer testiranja integracije tako da je potrebna druga ovisnost.

U ovom primjeru podrazvrstavamo Proizvoljna ovisnost klase, koja se koristi u primjeru podudaranja po tipu, za stvaranje Još jedna proizvoljna ovisnost razred:

javna klasa AnotherArbitraryDependency proširuje ArbitraryDependency {private final String label = "Još jedna proizvoljna ovisnost"; javni String toString () {povratna oznaka; }}

Cilj svakog test slučaja je osigurati da se svaka ovisnost pravilno ubrizga u svaku referentnu varijablu:

@Inject private ArbitraryDependency defaultDependency; @ Ubrizgajte privatnu arbitrarnu ovisnost namedDependency;

The FieldQualifierInjectTest integracijski test koji se koristi za demonstraciju podudaranja prema kvalifikatoru naveden je kako slijedi:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestInjectQualifier.class) javna klasa FieldQualifierInjectIntegrationTest {@Dependence private Arbitendendence Arbitend Arbite; @ Ubrizgajte privatnu arbitrarnu ovisnost namedDependency; @Test javna praznina givenInjectQualifier_WhenOnField_ThenDefaultFileValid () {assertNotNull (defaultDependency); assertEquals ("Proizvoljna ovisnost", defaultDependency.toString ()); } @Test javna praznina givenInjectQualifier_WhenOnField_ThenNamedFileValid () {assertNotNull (defaultDependency); assertEquals ("Još jedna proizvoljna ovisnost", namedDependency.toString ()); }}

Ako postoji više implementacija određene klase u kontekstu aplikacije i FieldQualifierInjectTest integracijski test pokušava ubrizgati ovisnosti na način naveden u nastavku:

@Inject private ArbitraryDependency defaultDependency; @ Ubrizgajte privatnu arbitrarnu ovisnost namedDependency;

a NoUniqueBeanDefinitionException bit će bačen.

Bacanje ove iznimke način je Spring Framework-a koji ukazuje na to da postoji više implementacija određene klase i da je zbunjeno oko toga koju koristiti. Da biste rasvijetlili zabunu, idite na redove 7 i 10 FieldQualifierInjectTest integracijski test:

@Inject private ArbitraryDependency defaultDependency; @ Ubrizgajte privatnu arbitrarnu ovisnost namedDependency;

proslijedite traženo ime graha na @Kvalifikator napomena koja se koristi zajedno s @Ubrizgati bilješka. Blok koda sada će izgledati kako slijedi:

@Inject @Qualifier ("defaultFile") private ArbitraryDependency defaultDependency; @Inject @Qualifier ("namedFile") private ArbitraryDependency namedDependency;

The @Kvalifikator anotacija očekuje strogo podudaranje prilikom primanja imena zrna. Osigurajte da se naziv zrna prenese na Kvalifikator točno, inače, a NoUniqueBeanDefinitionException bit će bačen. Ponovno pokrenite test i ovaj put bi trebao proći.

3.1.3. Podudaranje po imenu

The FieldByNameInjectTest integracijski test koji se koristi za pokazivanje podudaranja po imenu sličan je podudaranju prema tipu izvršenja. Jedina razlika je što je sada potreban određeni grah, za razliku od određene vrste. U ovom primjeru podrazvrstavamo Proizvoljna ovisnost razred opet za proizvodnju IpakJoš jedna proizvoljna ovisnost razred:

javna klasa YetA AnotherArbitraryDependency proširuje ArbitraryDependency {private final String label = "Još jedna proizvoljna ovisnost"; javni String toString () {povratna oznaka; }}

Da bismo demonstrirali put izvršavanja podudaranja po imenu, poslužit ćemo se sljedećim testom integracije:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestInjectName.class) javna klasa FieldByNameInjectIntegrationTest {@Inject @DamenceDieldFieldIndenceDendencendDendenceDindendenceDendencendDendencendDendency @Test javna praznina givenInjectQualifier_WhenSetOnField_ThenDependencyValid () {assertNotNull (yetA AnotherFieldInjectDependency); assertEquals ("Još jedna proizvoljna ovisnost", yetAnotherFieldInjectDependency.toString ()); }}

Kontekst aplikacije naveden je kako slijedi:

@Configuration javna klasa ApplicationContextTestInjectName {@Bean public ArbitraryDependency yetAnotherFieldInjectDependency () {ArbitraryDependency yetAnotherFieldInjectDependency = new YetAnotherArbitraryDependency (); return yetAnotherFieldInjectDependency; }}

Pokrenite test integracije kakav jest i on će proći.

Da biste provjerili je li ovisnost zaista ubrizgana putem izvršenja podudaranja po imenu, promijenite vrijednost, yetAnotherFieldInjectDependency, koja je prenesena na @Name napomena uz drugo ime po vašem izboru. Ponovno pokrenite test - ovaj put, a NoSuchBeanDefinitionException baca se.

3.2. Setter Injection

Injekcija za @Ubrizgati anotacija je slična pristupu koji se koristi za @Resurs injekcija na bazi setera. Umjesto bilježenja referentne varijable, bilježi se odgovarajuća metoda postavljača. Putovi izvršenja praćeni ubrizgavanjem ovisnosti na terenu također se primjenjuju na ubrizgavanje temeljeno na postavljaču.

4. The @Autowired Bilješka

Ponašanje @Autowired napomena slična je @Ubrizgati bilješka. Jedina razlika je u tome što @Autowired anotacija je dio okvira Spring. Ova napomena ima iste staze izvođenja kao i @Ubrizgati napomena, poredana po redoslijedu:

  1. Podudaranje po vrsti
  2. Utakmica po kvalifikacijama
  3. Podudaranje po imenu

Ovi putovi izvršenja primjenjivi su i na postavljač i na ubrizgavanje polja.

4.1. Ubrizgavanje polja

4.1.1. Podudaranje po vrsti

Primjer integracijskog testiranja korišten za demonstraciju @Autowired put izvršavanja podudaranja po tipu bit će sličan testu korištenom za demonstraciju @Ubrizgati put izvršavanja podudaranja po tipu. The FieldAutowiredTest integracijski test koji se koristi za pokazivanje podudaranja po tipu pomoću @Autowired napomena je navedena na sljedeći način:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestAutowiredType.class) javna klasa FieldAutowiredIntegrationTest {@AutowiredTransportDependency; @Test javna praznina givenAutowired_WhenSetOnField_ThenDependencyResolved () {assertNotNull (fieldDependency); assertEquals ("Proizvoljna ovisnost", fieldDependency.toString ()); }}

Kontekst aplikacije za ovaj test integracije naveden je kako slijedi:

@Configuration javna klasa ApplicationContextTestAutowiredType {@Bean public ArbitraryDependency autowiredFieldDependency () {ArbitraryDependency autowiredFieldDependency = new ArbitraryDependency (); vratiti autowiredFieldDependency; }}

Cilj integracijskog testa je pokazati da podudaranje po tipu ima prvi prioritet nad ostalim putovima izvršenja. Obavijest u retku 8 FieldAutowiredTest integracijski test kako naziv referentne varijable:

@Autowired private ArbitraryDependency fieldDependency;

razlikuje se od naziva zrna u kontekstu aplikacije:

@Bean public ArbitraryDependency autowiredFieldDependency () {ArbitraryDependency autowiredFieldDependency = nova ArbitrarDependency (); vratiti autowiredFieldDependency; }

Kada se test pokrene, proći će.

Da biste potvrdili da je ovisnost zaista riješena korištenjem puta izvršavanja podudaranja po tipu, promijenite tip poljeOvisnost referentna varijabla i ponovno pokrenite test integracije. Ovaj put za FieldAutowiredTest integracijski test mora pasti, s a NoSuchBeanDefinitionException biti bačen. Ovo potvrđuje da je podudaranje po tipu korišteno za rješavanje ovisnosti.

4.1.2. Utakmica po kvalifikacijama

Što ako se suočimo sa situacijom u kojoj je više implementacija graha definirano u kontekstu aplikacije, poput one dolje navedene:

@Configuration javna klasa ApplicationContextTestAutowiredQualifier {@Bean public ArbitraryDependency autowiredFieldDependency () {ArbitraryDependency autowiredFieldDependency = new ArbitraryDependency (); vratiti autowiredFieldDependency; } @Bean public ArbitraryDependency anotherAutowiredFieldDependency () {ArbitraryDependency anotherAutowiredFieldDependency = new AnotherArbitraryDependency (); vrati anotherAutowiredFieldDependency; }}

Ako je FieldQualifierAutowiredTest izvršava se integracijski test, naveden u nastavku:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestAutowiredQualifier.class) javna klasa FieldQualifierAutowiredIntegrationTest {@AutowiredIntegrationTest {ArbitDefaultDefaultText {@AutowiredIntegrationTest {@AutowiredDefaultText {@AutowiredIntegrationTest {@AutowiredIndegrationTest {@Autowired @Autowired private ArbitraryDependency fieldDependency2; @Test javna praznina givenAutowiredQualifier_WhenOnField_ThenDep1Valid () {assertNotNull (fieldDependency1); assertEquals ("Proizvoljna ovisnost", fieldDependency1.toString ()); } @Test javna praznina givenAutowiredQualifier_WhenOnField_ThenDep2Valid () {assertNotNull (fieldDependency2); assertEquals ("Još jedna proizvoljna ovisnost", fieldDependency2.toString ()); }}

a NoUniqueBeanDefinitionException bit će bačen.

Iznimka je zbog dvosmislenosti koju uzrokuju dva graha definirana u kontekstu aplikacije. Spring Framework ne zna koju bi ovisnost o grahu trebalo automatski spojiti na koju referentnu varijablu. Riješite ovaj problem dodavanjem @Kvalifikator napomena na retke 7 i 10 FieldQualifierAutowiredTest integracijski test:

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

tako da blok koda izgleda ovako:

@Autowired @Qualifier ("autowiredFieldDependency") private FieldDependency fieldDependency1; @Autowired @Qualifier ("anotherAutowiredFieldDependency") private FieldDependency fieldDependency2;

Ponovno pokrenite test i ovaj put će proći.

4.1.3. Podudaranje po imenu

Isti scenarij test integracije koristit će se za demonstraciju puta izvršavanja podudaranja po imenu kada se koristi @Autowired napomena za ubrizgavanje ovisnosti o polju. Prilikom automatskog povezivanja ovisnosti prema imenu, @ComponentScan napomena se mora koristiti s kontekstom aplikacije, ApplicationContextTestAutowiredName:

@Configuration @ComponentScan (basePackages = {"com.baeldung.dependency"}) javna klasa ApplicationContextTestAutowiredName {}

The @ComponentScan anotacija će pretraživati ​​pakete Java klasa koje su označene s @Komponenta bilješka. Na primjer, u kontekstu aplikacije, com.baeldung.zavisnost paket će se skenirati za predmete koji su označeni s @Komponenta bilješka. U ovom scenariju, Spring Framework mora otkriti Proizvoljna ovisnost razred, koji ima @Komponenta napomena:

@Component (value = "autowiredFieldDependency") javna klasa ArbitraryDependency {private final String label = "Arbitrar Dependency"; javni String toString () {povratna oznaka; }}

Vrijednost atributa, autowiredFieldDependency, prešao u @Komponenta napomena, govori Proljetnom okviru da Proizvoljna ovisnost razred je komponenta imenovana autowiredFieldDependency. Da bi se @Autowired napomena za rješavanje ovisnosti imenom, naziv komponente mora odgovarati imenu polja definiranom u FieldAutowiredNameTest integracijski test; pogledajte redak 8:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (loader = AnnotationConfigContextLoader.class, classes = ApplicationContextTestAutowiredName.class) javna klasa FieldAutowiredNameIntegrationTest {@Autowired private Arbitrary; @Test javna praznina givenAutowiredAnnotation_WhenOnField_ThenDepValid () {assertNotNull (autowiredFieldDependency); assertEquals ("Proizvoljna ovisnost", autowiredFieldDependency.toString ()); }}

Kada FieldAutowiredNameTest integracijski test se izvodi takav kakav jest, proći će.

Ali kako znamo da je @Autowired napomena stvarno pozvala stazu izvršenja podudaranja po imenu? Promijenite naziv referentne varijable autowiredFieldDependency na drugo ime po vašem izboru, a zatim ponovo pokrenite test.

Ovaj put test neće uspjeti i a NoUniqueBeanDefinitionException baca se. Slična provjera bila bi i promjena @Komponenta vrijednost atributa, autowiredFieldDependency, na drugu vrijednost po vašem izboru i ponovo pokrenite test. A NoUniqueBeanDefinitionException također će biti bačen.

Ova je iznimka dokaz da ako se koristi netočno ime graha, neće se naći valjani grah. Stoga je pozvan put izvršenja podudaranja po imenu.

4.2. Setter Injection

Injekcija za @Autowired anotacija je sličan pristupu demonstriranom za @Resurs injekcija na bazi setera. Umjesto označavanja referentne varijable znakom @Ubrizgati napomena, bilježi se odgovarajući postavljač. Putovi izvršenja praćeni ubrizgavanjem ovisnosti na terenu također se primjenjuju na ubrizgavanje temeljeno na postavljaču.

5. Primjena ovih napomena

To postavlja pitanje koju napomenu treba koristiti i pod kojim okolnostima? Odgovor na ova pitanja ovisi o scenariju dizajna s kojim se suočava dotična aplikacija i o tome kako programer želi iskoristiti polimorfizam na temelju zadanih putova izvršenja svake bilješke.

5.1. Primjena pojedinačnih pojedinaca kroz polimorfizam

Ako je dizajn takav da se ponašanje aplikacije temelji na implementacijama sučelja ili apstraktne klase, a ta se ponašanja koriste u cijeloj aplikaciji, tada upotrijebite ili @Ubrizgati ili @Autowired bilješka.

Prednost ovog pristupa je u tome što kada se aplikacija nadograđuje ili treba primijeniti zakrpu kako bi se ispravila programska pogreška; tada se razredi mogu zamijeniti s minimalnim negativnim utjecajem na cjelokupno ponašanje aplikacije. U ovom je scenariju primarni zadani put izvršenja podudaranje po tipu.

5.2. Drobnozrnasta konfiguracija ponašanja aplikacije kroz polimorfizam

Ako je dizajn takav da aplikacija ima složeno ponašanje, svako ponašanje temelji se na različitim sučeljima / apstraktnim klasama, a upotreba svake od ovih implementacija razlikuje se u aplikaciji, tada upotrijebite @Resurs bilješka. U ovom je scenariju primarni zadani put izvršenja podudaranje po imenu.

5.3. Injekcijom ovisnosti treba se baviti isključivo platforma Jakarta EE

Ako postoji mandat za dizajn za sve ovisnosti koje treba ubrizgati Jakarta EE platforma, a ne proljeće, tada je izbor između @Resurs bilješka i @Ubrizgati bilješka. Konačnu odluku trebali biste suziti između dviju bilješki na temelju toga koji je zadani put izvršenja potreban.

5.4. Ubrizgavanjem ovisnosti proljetni bi se okvir trebao baviti isključivo

Ako je mandat da sve ovisnosti rješava Proljetni okvir, jedini izbor je @Autowired bilješka.

5.5. Sažetak rasprave

Sljedeća tablica rezimira raspravu.

Scenarij@Resurs@Ubrizgati@Autowired
Primjena jednokratnih primjena kroz polimorfizam
Fino zrnasta konfiguracija ponašanja aplikacije kroz polimorfizam
Injekcijom ovisnosti trebala bi se baviti isključivo platforma Jakarta EE
Injekcijom ovisnosti trebao bi se baviti isključivo Proljetni okvir

6. Zaključak

Članak je imao za cilj pružiti dublji uvid u ponašanje svake bilješke. Razumijevanje ponašanja svake bilješke pridonijet će boljem cjelokupnom dizajnu i održavanju aplikacije.

Kôd korišten tijekom rasprave može se naći na GitHubu.