Proljetno skeniranje komponenata

1. Pregled

U ovom ćemo uputstvu analizirati skeniranje komponenata u proljeće. Kada radimo s Springom, možemo predavati svoje predmete kako bismo od njih napravili proljetni grah. Ali, osim toga, proljeću možemo reći gdje tražiti ove označene klase jer ne moraju svi oni postati grah u ovom određenom potezu.

Naravno, postoje neke zadane vrijednosti za skeniranje komponenata, ali možemo prilagoditi i pakete za pretraživanje.

Prvo, pogledajmo zadane postavke.

2. @ComponentScan Bez argumenata

2.1. Koristeći @ComponentScan u proljetnoj prijavi

S proljećem, koristimo @ComponentScan napomena uz @Konfiguracija napomena za specificiranje paketa koje želimo skenirati. @ComponentScan bez argumenata govori Springu da skenira trenutni paket i sve njegove podpakete.

Recimo da imamo sljedeće @Konfiguracija u com.baeldung.componentscan.springapp paket:

@Configuration @ComponentScan javna klasa SpringComponentScanApp {private static ApplicationContext applicationContext; @Bean public ExampleBean exampleBean () {return new ExampleBean (); } javna statička void glavna (String [] args) {applicationContext = new AnnotationConfigApplicationContext (SpringComponentScanApp.class); for (String beanName: applicationContext.getBeanDefinitionNames ()) {System.out.println (beanName); }}}

Također, recimo da imamo Mačka i Pas komponente u com.baeldung.componentscan.springapp.životinje paket:

paket com.baeldung.componentscan.springapp.animals; // ... @Component javni razred Cat {}
paket com.baeldung.componentscan.springapp.animals; // ... @Component public class Dog {}

I konačno, imamo Ruža komponenta u com.baeldung.componentscan.springapp.flowers paket:

paket com.baeldung.componentscan.springapp.flowers; // ... @Component javni razred Rose {}

Rezultat glavni() metoda sadržavat će sve mahune com.baeldung.componentscan.springapp paketa i njegovih podpaketa:

springComponentScanApp mačka pseća ruža primjerBean

Imajte na umu da je glavna klasa aplikacije također grah jer je označen s tim @Konfiguracija, što je a @Komponenta.

Također, imajte na umu da glavna klasa aplikacije i klasa konfiguracije nisu nužno isto. Ako se razlikuju, nije važno kamo staviti glavnu klasu aplikacije. Važno je samo mjesto klase konfiguracije jer skeniranje komponenata prema zadanim postavkama započinje iz njenog paketa.

Konačno, imajte na umu to u našem primjeru @ComponentScan ekvivalentno je:

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

gdje basePackages argument je paket ili niz paketa za skeniranje.

2.2. Koristeći @ComponentScan u Spring Boot Application

Trik je Spring Boot-a u tome što se mnoge stvari događaju implicitno. Koristimo @SpringBootApplication napomena, ali to je samo kombinacija tri napomene:

@Configuration @EnableAutoConfiguration @ComponentScan

Stvorimo sličnu strukturu u com.baeldung.componentscan.springbootapp paket. Ovaj put glavna prijava bit će:

paket com.baeldung.componentscan.springbootapp; // ... @SpringBootApplication javna klasa SpringBootComponentScanApp {private static ApplicationContext applicationContext; @Bean public ExampleBean exampleBean () {return new ExampleBean (); } javna statička void glavna (String [] args) {applicationContext = SpringApplication.run (SpringBootComponentScanApp.class, args); checkBeansPresence ("mačka", "pas", "ruža", "primjerBean", "springBootComponentScanApp"); } privatna statička void checkBeansPresence (String ... grah) {for (String beanName: grah) {System.out.println ("Is" + beanName + "u ApplicationContext:" + applicationContext.containsBean (beanName)); }}}

Svi ostali paketi i razredi ostaju isti, samo ćemo ih kopirati u obližnju com.baeldung.componentscan.springbootapp paket.

Spring Boot skenira pakete slično našem prethodnom primjeru. Provjerimo izlaz:

Je li mačka u ApplicationContext: true Je li pas u ApplicationContext: true Je li ruža u ApplicationContext: true Je exampleBean u ApplicationContext: true Je li springBootComponentScanApp u ApplicationContext: true

Razlog zbog kojeg upravo provjeravamo da li grah postoji u našem drugom primjeru (za razliku od ispisivanja svih grahova) jest taj što bi izlaz bio prevelik.

To je zbog implicitnog @EnableAutoConfiguration napomena zbog koje Spring Boot automatski stvara mnoštvo graha, oslanjajući se na ovisnosti u pom.xml datoteka.

3. @ComponentScan S argumentima

Sada prilagodimo staze za skeniranje. Na primjer, recimo da želimo isključiti Ruža grah.

3.1. @ComponentScan za određene pakete

To možemo na nekoliko načina. Prvo, možemo promijeniti osnovni paket:

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

Sada će izlaz biti:

springComponentScanApp mačji pas primjerBean

Pogledajmo što stoji iza ovoga:

  • springComponentScanApp je stvoren jer je to konfiguracija koja se prosljeđuje kao argument datoteci AnnotationConfigApplicationContext
  • primjerBean je grah konfiguriran unutar konfiguracije
  • mačka i pas su u navedenom com.baeldung.componentscan.springapp.životinje paket

Sve gore navedene prilagodbe primjenjive su i u Spring Boot-u. Možemo koristiti @ComponentScan zajedno s @SpringBootApplication a rezultat će biti isti:

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

3.2. @ComponentScan s isključenjima

Drugi način je upotreba filtra, navodeći obrazac za izuzeće klasa:

@ComponentScan (excludeFilters = @ ComponentScan.Filter (type = FilterType.REGEX, pattern = "com \. Baeldung \. Componentscan \. Springapp \. Flowers \ .. *"))

Možemo odabrati i drugu vrstu filtra, kao napomena podržava nekoliko fleksibilnih opcija za filtriranje skeniranih klasa:

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

4. Zadani paket

Trebali bismo izbjegavati stavljanje @Konfiguracija klase u zadanom paketu (tj. uopće ne navodeći paket). U ovom slučaju, Spring skenira sve razrede u svim staklenkama na stazi. To uzrokuje pogreške i aplikacija se vjerojatno ne pokreće.

5. Zaključak

U ovom smo članku saznali koje pakete Spring skenira prema zadanim postavkama i kako prilagoditi ove staze.

Kao i obično, cjeloviti kôd dostupan je na GitHubu.