Upravljanje redoslijedom izrade zrna pomoću bilješke @DependsOn
1. Pregled
Spring, prema zadanim postavkama, upravlja životnim ciklusom graha i uređuje njihov redoslijed inicijalizacije.
Ali, još uvijek ga možemo prilagoditi na temelju naših potreba. Možemo odabrati bilo koji SmartLifeCycle sučelje ili @Ovisi o napomena za upravljanje redoslijedom inicijalizacije.
Ovaj tutorial istražuje @Ovisi o napomena i njezino ponašanje u slučaju nestanka graha ili kružne ovisnosti. Ili u slučaju da jednostavno treba jedan grah inicijaliziran prije drugog.
2. Maven
Prije svega, uvezimo ovisnost o proljetnom kontekstu u naš pom.xml datoteka. Uvijek bismo se trebali obratiti Maven Centralu za najnoviju verziju ovisnosti:
org.springframework proljeće-kontekst 5.2.8.OSLOBOĐENJE
3. @Ovisi o
Ovu bismo bilješku trebali koristiti za specificiranje ovisnosti graha. Spring jamči da će definirani grah biti inicijaliziran prije pokušaja inicijalizacije trenutnog graha.
Recimo da imamo a FileProcessor što ovisi o a Čitač datoteka i FileWriter. U ovom slučaju, Čitač datoteka i FileWriter treba inicijalizirati prije FileProcessor.
4. Konfiguracija
Konfiguracijska datoteka je čista Java klasa s @Konfiguracija napomena:
@Configuration @ComponentScan ("com.baeldung.dependson") javna klasa Config {@Bean @DependsOn ({"fileReader", "fileWriter"}) javni FileProcessor fileProcessor () {return new FileProcessor (); } @Bean ("fileReader") javni FileReader fileReader () {vratiti novi FileReader (); } @Bean ("fileWriter") javni FileWriter fileWriter () {vratiti novi FileWriter (); }}
FileProcessor određuje svoje ovisnosti s @Ovisi o. Također možemo označiti a Komponenta s @Ovisi o:
@Component @DependsOn ({"filereader", "fileWriter"}) javna klasa FileProcessor {}
5. Upotreba
Stvorimo jedan razred Datoteka. Svaki od graha ažurira tekst iznutra Datoteka. Čitač datoteka ažurira ga kao pročitano. FileWriter ažurira ga kao write i FileProcessor ažurira tekst kako je obrađen:
@Test public void WhenFileProcessorIsCreated_FileTextContains_Processed () {FileProcessor procesor = context.getBean (FileProcessor.class); assertTrue (processor.process (). ENDWith ("obrađeno")); }
5.1. Nedostaje ovisnost
U slučaju nedostajanja ovisnosti, Spring baca a BeanCreationException s osnovnom iznimkom od NoSuchBeanDefinitionException. Pročitajte više o NoSuchBeanDefinitionException ovdje.
Na primjer, dummyFileProcessor grah ovisi o a dummyFileWriter grah. Od dummyFileWriter ne postoji, baca BeanCreationException:
@Test (očekuje se = NoSuchBeanDefinitionException.class) javna void kadaDependentBeanNotAvailable_ThrowsNosuchBeanDefinitionException () {context.getBean ("dummyFileProcessor"); }
5.2. Kružna ovisnost
Također, u ovom slučaju, baca BeanCreationException i ističe da grah ima kružnu ovisnost:
@Bean ("dummyFileProcessorCircular") @DependsOn ({"dummyFileReaderCircular"}) @ Lijeni javni FileProcessor dummyFileProcessorCircular () {vratiti novi FileProcessor (datoteka); }
Kružne ovisnosti mogu se dogoditi ako grah eventualno ovisi o sebi, stvaranje kruga:
Grah1 -> Grah4 -> Grah6 -> Grah1
6. Ključne točke
Napokon, postoji nekoliko točaka na koje bismo trebali voditi računa tijekom korištenja @Ovisi o napomena:
- Dok se koristi @Ovisi o, moramo koristiti skeniranje komponenata
- Ako je a Ovisi o-annotirana klasa se deklarira putem XML-a, Ovisi o metapodaci bilješki se zanemaruju
7. Zaključak
@Ovisi o postaje posebno korisno kada se grade sustavi sa složenim zahtjevima ovisnosti.
Olakšava ubrizgavanje ovisnosti, osiguravajući da će Spring provesti sve inicijalizacije potrebnih graha prije učitavanja naše ovisne klase.
Kao i uvijek, kod se može pronaći na GitHub-u.