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.


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