Kontrollerer orden for oppretting av bønner med @DependsOn-kommentar

1. Oversikt

Våren styrer som standard bønnes livssyklus og ordner initialiseringsrekkefølgen.

Men vi kan fortsatt tilpasse det ut fra våre behov. Vi kan velge enten SmartLifeCycle grensesnitt eller @Kommer an på kommentar for å administrere initialiseringsordren.

Denne opplæringen utforsker @Kommer an på merknader og oppførsel i tilfelle manglende bønne eller sirkulær avhengighet. Eller i tilfelle du bare trenger en bønne initialisert før en annen.

2. Maven

La oss først og fremst importere avhengighet av vårkontekst i vår pom.xml fil. Vi bør alltid henvise til Maven Central for den siste versjonen av avhengigheter:

 org.springframework spring-context 5.2.8.RELEASE 

3. @Kommer an på

Vi bør bruke denne merknaden for å spesifisere avhengighet av bønner. Vår garanterer at de definerte bønnene vil initialiseres før du prøver å initialisere den nåværende bønnen.

La oss si at vi har en FileProcessor som avhenger av en FileReader og FileWriter. I dette tilfellet, FileReader og FileWriter bør initialiseres før FileProcessor.

4. Konfigurasjon

Konfigurasjonsfilen er en ren Java-klasse med @Konfigurasjon 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 spesifiserer dens avhengighet med @Kommer an på. Vi kan også kommentere a Komponent med @Kommer an på:

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

5. Bruk

La oss lage en klasse Fil. Hver av bønnene oppdaterer teksten i Fil. FileReader oppdaterer den som lest. FileWriter oppdaterer den som skriv og FileProcessor oppdaterer teksten som behandlet:

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

5.1. Mangler avhengighet

Ved manglende avhengighet kaster Spring a BeanCreationException med et grunn unntak av NoSuchBeanDefinitionException. Les mer om NoSuchBeanDefinitionException her.

For eksempel, dummyFileProcessor bønne avhenger av en dummyFileWriter bønne. Siden dummyFileWriter eksisterer ikke, det kaster det BeanCreationException:

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

5.2. Sirkulær avhengighet

I dette tilfellet kaster det også BeanCreationException og fremhever at bønnene har en sirkulær avhengighet:

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

Sirkulære avhengigheter kan skje hvis en bønne har en eventuell avhengighet av seg selv, oppretter en sirkel:

Bean1 -> Bean4 -> Bean6 -> Bean1

6. Nøkkelpunkter

Til slutt er det få punkter som vi bør ta vare på mens vi bruker @Kommer an på kommentar:

  • Mens du bruker @Kommer an på, vi må bruke komponentskanning
  • Hvis en Kommer an på-anmeldt klasse er erklært via XML, Kommer an på merknadsmetadata blir ignorert

7. Konklusjon

@Kommer an på blir spesielt nyttig når man bygger systemer med komplekse avhengighetskrav.

Det letter avhengighetsinjeksjonen, og sørger for at våren vil ha håndtert all initialiseringen av de nødvendige bønnene før de laster inn vår avhengige klasse.

Som alltid kan koden bli funnet på GitHub.


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