Vårkomponentskanning

1. Oversikt

I denne opplæringen vil vi dekke komponentskanning om våren. Når vi jobber med Spring, kan vi kommentere klassene våre for å gjøre dem til vårbønner. Men i tillegg til det vi kan fortelle våren hvor vi skal søke etter disse merkede klassene da ikke alle av dem må bli bønner i denne spesielle løpeturen.

Selvfølgelig er det noen standardinnstillinger for komponentskanning, men vi kan også tilpasse pakkene for søk.

La oss først se på standardinnstillingene.

2. @ComponentScan Uten argumenter

2.1. Ved hjelp av @ComponentScan i en vårsøknad

Med våren, vi bruker @ComponentScan kommentar sammen med @Konfigurasjon kommentar for å spesifisere pakkene vi ønsker å bli skannet. @ComponentScan uten argumenter ber Spring om å skanne den nåværende pakken og alle delpakker.

La oss si at vi har følgende @Konfigurasjon i com.baeldung.componentscan.springapp pakke:

@Configuration @ComponentScan offentlig klasse SpringComponentScanApp {privat statisk ApplicationContext applicationContext; @Bean public ExampleBean exampleBean () {returner nytt ExampleBean (); } public static void main (String [] args) {applicationContext = new AnnotationConfigApplicationContext (SpringComponentScanApp.class); for (String beanName: applicationContext.getBeanDefinitionNames ()) {System.out.println (beanName); }}}

La oss også si at vi har Katt og Hund komponenter i com.baeldung.componentscan.springapp.dyr pakke:

pakke com.baeldung.componentscan.springapp.dyr; // ... @Komponent offentlig klasse Cat {}
pakke com.baeldung.componentscan.springapp.dyr; // ... @Komponent offentlig klasse Hund {}

Og til slutt har vi Rose komponent i com.baeldung.componentscan.springapp.blomster pakke:

pakke com.baeldung.componentscan.springapp.flowers; // ... @Komponent offentlig klasse Rose {}

Resultatet av hoved() metoden vil inneholde alle bønner av com.baeldung.componentscan.springapp pakken og dens underpakker:

springComponentScanApp katthund rose eksempelBønne

Merk at hovedapplikasjonsklassen også er en bønne som den er merket med @Konfigurasjon, hvilken er en @Komponent.

Vær også oppmerksom på at hovedapplikasjonsklassen og konfigurasjonsklassen ikke nødvendigvis er den samme. Hvis de er forskjellige, spiller det ingen rolle hvor du skal plassere hovedapplikasjonsklassen. Bare plasseringen til konfigurasjonsklassen har betydning da komponentskanning starter fra pakken som standard.

Til slutt, merk deg at i vårt eksempel @ComponentScan tilsvarer:

@ComponentScan (basePackages = "com.baeldung.componentscan.springapp")

hvor basePackages argument er en pakke eller en rekke pakker for skanning.

2.2. Ved hjelp av @ComponentScan i en Spring Boot-applikasjon

Trikset med Spring Boot er at mange ting skjer implisitt. Vi bruker @SpringBootApplication kommentar, men det er bare en kombinasjon av tre kommentarer:

@Configuration @EnableAutoConfiguration @ComponentScan

La oss lage en lignende struktur i com.baeldung.componentscan.springbootapp pakke. Denne gangen vil hovedapplikasjonen være:

pakke com.baeldung.componentscan.springbootapp; // ... @SpringBootApplication offentlig klasse SpringBootComponentScanApp {privat statisk ApplicationContext applicationContext; @Bean public ExampleBean exampleBean () {returner nytt ExampleBean (); } public static void main (String [] args) {applicationContext = SpringApplication.run (SpringBootComponentScanApp.class, args); checkBeansPresence ("cat", "dog", "rose", "exampleBean", "springBootComponentScanApp"); } privat statisk ugyldig checkBeansPresence (String ... beans) {for (String beanName: beans) {System.out.println ("Er" + beanName + "i ApplicationContext:" + applicationContext.containsBean (beanName)); }}}

Alle andre pakker og klasser forblir de samme, vi kopierer dem bare til nærliggende com.baeldung.componentscan.springbootapp pakke.

Spring Boot skanner pakker på samme måte som vårt forrige eksempel. La oss sjekke utdataene:

Er katt i ApplicationContext: true Er hund i ApplicationContext: true Er rose i ApplicationContext: true Er eksempelBean i ApplicationContext: true Er springBootComponentScanApp i ApplicationContext: true

Grunnen til at vi bare sjekker bønnene for eksistens i vårt andre eksempel (i motsetning til å skrive ut alle bønnene), er at utgangen vil være for stor.

Dette er på grunn av det implisitte @EnableAutoConfiguration merknad som gjør at Spring Boot oppretter mange bønner automatisk, avhengig av avhengighetene i pom.xml fil.

3. @ComponentScan Med argumenter

La oss nå tilpasse banene for skanning. La oss for eksempel si at vi vil ekskludere Rose bønne.

3.1. @ComponentScan for spesifikke pakker

Vi kan gjøre det på noen få måter. Først kan vi endre basispakken:

@ComponentScan (basePackages = "com.baeldung.componentscan.springapp.animals") @Configuration offentlig klasse SpringComponentScanApp {// ...}

Nå vil utgangen være:

springComponentScanApp katthund eksempelBønne

La oss se hva som ligger bak dette:

  • springComponentScanApp er opprettet som det er en konfigurasjon sendt som et argument til AnnotationConfigApplicationContext
  • eksempelBønne er en bønne konfigurert inne i konfigurasjonen
  • katt og hund er i det angitte com.baeldung.componentscan.springapp.dyr pakke

Alle de ovennevnte tilpasningene gjelder også i Spring Boot. Vi kan bruke @ComponentScan sammen med @SpringBootApplication og resultatet blir det samme:

@SpringBootApplication @ComponentScan (basePackages = "com.baeldung.componentscan.springbootapp.animals")

3.2. @ComponentScan med unntak

En annen måte er å bruke et filter som angir mønsteret for klassene som skal ekskluderes:

@ComponentScan (excludeFilters = @ ComponentScan.Filter (type = FilterType.REGEX, mønster = "com \. Baeldung \. Komponenter kan \. Springapp \. Blomster \ .. *"))

Vi kan også velge en annen filtertype, som kommentaren støtter flere fleksible alternativer for å filtrere de skannede klassene:

@ComponentScan (excludeFilters = @ ComponentScan.Filter (type = FilterType.ASSIGNABLE_TYPE, verdi = Rose.class))

4. Standardpakken

Vi bør unngå å sette @Konfigurasjon klasse i standardpakken (dvs. ved ikke å spesifisere pakken i det hele tatt). I dette tilfellet skanner Spring alle klassene i alle glassene i en klassesti. Det forårsaker feil, og applikasjonen starter sannsynligvis ikke.

5. Konklusjon

I denne artikkelen har vi lært hvilke pakker Spring skanner som standard og hvordan du kan tilpasse disse banene.

Som vanlig er den komplette koden tilgjengelig på GitHub.


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