Styring af oprettelse af bønner med @DependsOn-kommentar

1. Oversigt

Spring administrerer som standard bønnernes livscyklus og arrangerer deres initialiseringsrækkefølge.

Men vi kan stadig tilpasse det ud fra vores behov. Vi kan vælge enten SmartLifeCycle interface eller @Afhænger af kommentar til styring af initialiseringsordre.

Denne tutorial udforsker @Afhænger af anmærkning og dens opførsel i tilfælde af en manglende bønne eller cirkulær afhængighed. Eller i tilfælde af simpelthen brug for en bøn initialiseret før en anden.

2. Maven

Lad os først importere afhængighed af forårskontekst i vores pom.xml fil. Vi bør altid henvise til Maven Central for den nyeste version af afhængigheder:

 org.springframework spring-context 5.2.8.RELEASE 

3. @Afhænger af

Vi bør bruge denne kommentar til at specificere bønneafhængigheder. Forår garanterer, at de definerede bønner initialiseres, inden man forsøger at initialisere den aktuelle bønne.

Lad os sige, at vi har en FileProcessor som afhænger af en FileReader og FileWriter. I dette tilfælde, FileReader og FileWriter skal initialiseres inden FileProcessor.

4. Konfiguration

Konfigurationsfilen er en ren Java-klasse med @Konfiguration kommentar:

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

FileProcessor angiver dens afhængigheder med @Afhænger af. Vi kan også kommentere a Komponent med @Afhænger af:

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

5. Anvendelse

Lad os oprette en klasse Fil. Hver af bønnerne opdaterer teksten indeni Fil. FileReader opdaterer det som læst. FileWriter opdaterer det som skriv og FileProcessor opdaterer teksten som behandlet:

@Test offentlig ugyldig WhenFileProcessorIsCreated_FileTextContains_Processed () {FileProcessor processor = context.getBean (FileProcessor.class); assertTrue (processor.process (). endsWith ("behandlet")); }

5.1. Manglende afhængighed

I tilfælde af manglende afhængighed kaster Spring en BeanCreationException med en undtagelse af base NoSuchBeanDefinitionException. Læs mere om NoSuchBeanDefinitionException her.

For eksempel, dummyFileProcessor bønne afhænger af en dummyFileWriter bønne. Siden dummyFileWriter eksisterer ikke, det smider BeanCreationException:

@Test (forventet = NoSuchBeanDefinitionException.class) offentlig ugyldig nårDependentBeanNotAvailable_ThrowsNosuchBeanDefinitionException () {context.getBean ("dummyFileProcessor"); }

5.2. Cirkulær afhængighed

Også i dette tilfælde kaster det BeanCreationException og fremhæver, at bønnerne har en cirkulær afhængighed:

@Bean ("dummyFileProcessorCircular") @DependsOn ({"dummyFileReaderCircular"}) @Lazy offentlig FileProcessor dummyFileProcessorCircular () {returner ny FileProcessor (fil); }

Cirkulære afhængigheder kan ske, hvis en bønne har en eventuel afhængighed af sig selv, opretter en cirkel:

Bean1 -> Bean4 -> Bean6 -> Bean1

6. Nøglepunkter

Endelig er der få punkter, som vi skal tage os af, mens vi bruger @Afhænger af kommentar:

  • Under brug @Afhænger af, vi skal bruge komponentscanning
  • Hvis en Afhænger af-anmeldt klasse erklæres via XML, Afhænger af annotationsmetadata ignoreres

7. Konklusion

@Afhænger af bliver især nyttig, når man bygger systemer med komplekse afhængighedskrav.

Det letter afhængighedsinjektionen, hvilket sikrer, at Spring har håndteret al initialisering af de krævede bønner, inden de indlæser vores afhængige klasse.

Som altid kan koden findes på GitHub.


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