Besturing van de volgorde van het maken van bonen met @DependsOn-annotatie

1. Overzicht

Spring beheert standaard de levenscyclus van bonen en regelt hun initialisatie-volgorde.

Maar we kunnen het nog steeds aanpassen op basis van onze behoeften. We kunnen kiezen uit de SmartLifeCycle interface of de @Hangt af van annotatie voor het beheren van de initialisatieopdracht.

Deze tutorial verkent het @Hangt af van annotatie en zijn gedrag in het geval van een ontbrekende boon of circulaire afhankelijkheid. Of in het geval dat de ene boon vóór de andere moet worden geïnitialiseerd.

2. Maven

Laten we allereerst de afhankelijkheid van de lente-context importeren in onze pom.xml het dossier. We moeten altijd naar Maven Central verwijzen voor de nieuwste versie van afhankelijkheden:

 org.springframework spring-context 5.2.8.RELEASE 

3. @Hangt af van

We zouden deze annotatie moeten gebruiken voor het specificeren van bean-afhankelijkheden. Spring garandeert dat de gedefinieerde bonen worden geïnitialiseerd voordat wordt geprobeerd de huidige bonen te initialiseren.

Laten we zeggen dat we een FileProcessor die afhangt van een FileReader en FileWriter. In dit geval, FileReader en FileWriter moet worden geïnitialiseerd voordat de FileProcessor.

4. Configuratie

Het configuratiebestand is een pure Java-klasse met @Configuratie annotatie:

@Configuration @ComponentScan ("com.baeldung.dependson") openbare klasse Config {@Bean @DependsOn ({"fileReader", "fileWriter"}) openbare FileProcessor fileProcessor () {retourneer nieuwe FileProcessor (); } @Bean ("fileReader") openbare FileReader fileReader () {retourneer nieuwe FileReader (); } @Bean ("fileWriter") openbare FileWriter fileWriter () {retourneer nieuwe FileWriter (); }}

FileProcessor specificeert zijn afhankelijkheden met @Hangt af van. We kunnen ook een Component met @Hangt af van:

@Component @DependsOn ({"filereader", "fileWriter"}) openbare klasse FileProcessor {}

5. Gebruik

Laten we een klas maken het dossier. Elk van de bonen werkt de tekst erin bij het dossier. FileReader werkt het bij zoals gelezen. FileWriter werkt het bij als schrijven en FileProcessor werkt de tekst bij zoals verwerkt:

@ Test openbare ongeldige WhenFileProcessorIsCreated_FileTextContains_Processed () {FileProcessor processor = context.getBean (FileProcessor.class); assertTrue (processor.process (). endsWith ("verwerkt")); }

5.1. Ontbrekende afhankelijkheid

In het geval van een ontbrekende afhankelijkheid, gooit Spring een BeanCreationException met een basisuitzondering van NoSuchBeanDefinitionException. Lees er meer over NoSuchBeanDefinitionException hier.

Bijvoorbeeld, dummyFileProcessor boon is afhankelijk van een dummyFileWriter Boon. Sinds dummyFileWriter bestaat niet, het gooit BeanCreationException:

@Test (verwacht = NoSuchBeanDefinitionException.class) public void whenDependentBeanNotAvailable_ThrowsNosuchBeanDefinitionException () {context.getBean ("dummyFileProcessor"); }

5.2. Circulaire afhankelijkheid

Ook gooit het in dit geval BeanCreationException en benadrukt dat de bonen een circulaire afhankelijkheid hebben:

@Bean ("dummyFileProcessorCircular") @DependsOn ({"dummyFileReaderCircular"}) @Lazy openbare FileProcessor dummyFileProcessorCircular () {retourneer nieuwe FileProcessor (bestand); }

Circulaire afhankelijkheden kunnen optreden als een boon uiteindelijk afhankelijk is van zichzelf, een cirkel maken:

Boon1 -> Boon4 -> Boon6 -> Boon1

6. Kernpunten

Ten slotte zijn er enkele punten waar we tijdens het gebruik op moeten letten @Hangt af van annotatie:

  • Tijdens het gebruik @Hangt af van, we moeten component-scanning gebruiken
  • Als een Hangt af van-annotated class wordt gedeclareerd via XML, Hangt af van metagegevens van annotaties worden genegeerd

7. Conclusie

@Hangt af van wordt vooral handig bij het bouwen van systemen met complexe afhankelijkheidsvereisten.

Het vergemakkelijkt de Dependency Injection en zorgt ervoor dat Spring alle initialisatie van die vereiste Beans heeft afgehandeld voordat onze afhankelijke klasse werd geladen.

Zoals altijd is de code te vinden op GitHub.