Riadenie objednávky vytvorenia fazule s anotáciou @DependsOn
1. Prehľad
Jar štandardne riadi životný cyklus fazule a usporiada ich poradie inicializácie.
Stále si ju však môžeme prispôsobiť podľa našich potrieb. Môžeme si zvoliť buď SmartLifeCycle rozhranie alebo @Záleží na anotácia pre správu inicializačnej objednávky.
Tento tutoriál skúma @Záleží na anotácia a jej chovanie v prípade chýbajúcej fazuľovej alebo kruhovej závislosti. Alebo v prípade, že jednoducho potrebujete jednu fazuľu inicializovanú pred druhou.
2. Maven
Najskôr importujme závislosť jarného kontextu do nášho pom.xml spis. Najnovšiu verziu závislostí by sme mali vždy vyhľadávať v Maven Central:
org.springframework spring-context 5.2.8.RELEASE
3. @Záleží na
Túto anotáciu by sme mali použiť na určenie závislostí fazule. Jar zaručuje, že definované fazule budú inicializované pred pokusom o inicializáciu aktuálnej fazule.
Povedzme, že máme FileProcessor čo závisí od a FileReader a FileWriter. V tomto prípade, FileReader a FileWriter by sa mali inicializovať pred FileProcessor.
4. Konfigurácia
Konfiguračný súbor je čistá trieda Java s @ Konfigurácia anotácia:
@Configuration @ComponentScan ("com.baeldung.dependson") verejná trieda Config {@Bean @DependsOn ({"fileReader", "fileWriter"}) verejný FileProcessor fileProcessor () {vrátiť nový FileProcessor (); } @Bean ("fileReader") public FileReader fileReader () {vrátiť nový FileReader (); } @Bean ("fileWriter") public FileWriter fileWriter () {vrátiť nový FileWriter (); }}
FileProcessor určuje svoje závislosti pomocou @Záleží na. Môžeme tiež anotovať a Komponent s @Záleží na:
@Component @DependsOn ({"filereader", "fileWriter"}) verejná trieda FileProcessor {}
5. Použitie
Vytvorme jednu triedu Súbor. Každá z fazúľ aktualizuje text vo vnútri Súbor. FileReader aktualizuje ako prečítané. FileWriter aktualizuje ako zápis a FileProcessor aktualizuje text ako spracovaný:
@Test public void WhenFileProcessorIsCreated_FileTextContains_Processed () {FileProcessor processor = context.getBean (FileProcessor.class); assertTrue (processor.process (). endsWith ("spracované")); }
5.1. Chýba závislosť
V prípade chýbajúcej závislosti Spring hodí a BeanCreationException so základnou výnimkou NoSuchBeanDefinitionException. Prečítajte si viac o NoSuchBeanDefinitionException tu.
Napríklad, dummyFileProcessor fazuľa závisí od a dummyFileWriter fazuľa. Odkedy dummyFileWriter neexistuje, hádže BeanCreationException:
@Test (očakáva sa = NoSuchBeanDefinitionException.class) public void whenDependentBeanNotAvailable_ThrowsNosuchBeanDefinitionException () {context.getBean ("dummyFileProcessor"); }
5.2. Kruhová závislosť
Tiež v tomto prípade hodí BeanCreationException a zdôrazňuje, že fazuľa má kruhovú závislosť:
@Bean ("dummyFileProcessorCircular") @DependsOn ({"dummyFileReaderCircular"}) @Lazy public FileProcessor dummyFileProcessorCircular () {vrátiť nový FileProcessor (súbor); }
Kruhové závislosti sa môžu vyskytnúť, ak má fazuľa prípadnú závislosť od seba, vytvorenie kruhu:
Bean1 -> Bean4 -> Bean6 -> Bean1
6. Kľúčové body
Nakoniec existuje niekoľko bodov, o ktoré by sme sa mali pri používaní starať @Záleží na anotácia:
- Počas používania @Záleží na, musíme použiť skenovanie komponentov
- Ak Záleží na-anotovaná trieda je deklarovaná prostredníctvom XML, Záleží na metadáta anotácií sú ignorované
7. Záver
@Záleží na sa stáva obzvlášť užitočným pri budovaní systémov s komplexnými požiadavkami na závislosť.
Uľahčuje vkladanie závislostí a zaisťuje, že Spring pred načítaním našej závislej triedy zvládne celú inicializáciu požadovaných fazúľ.
Ako vždy, kód nájdete na GitHub.