Skenovanie jarných komponentov

1. Prehľad

V tomto výučbe sa budeme venovať skenovaniu komponentov na jar. Pri práci s jarom môžeme naše triedy anotovať, aby sa z nich stali jarné fazule. Ale okrem toho môžeme Jarovi povedať, kde má hľadať tieto anotované triedy pretože nie všetky sa musia v tomto konkrétnom behu stať fazuľou.

Samozrejme existujú niektoré predvolené nastavenia pre skenovanie komponentov, ale môžeme tiež prispôsobiť balíčky pre vyhľadávanie.

Najprv sa pozrime na predvolené nastavenia.

2. @ComponentScan Bez argumentov

2.1. Použitím @ComponentScan v jarnej aplikácii

S jarou, používame @ComponentScan anotácia spolu s @ Konfigurácia anotácia, aby sme určili balíčky, ktoré chceme skontrolovať. @ComponentScan bez argumentov povie Spring, aby skenovala aktuálny balík a všetky jeho čiastkové balíčky.

Povedzme, že máme nasledujúce @ Konfigurácia v com.baeldung.componentscan.springapp balenie:

@Configuration @ComponentScan verejná trieda SpringComponentScanApp {súkromná statická ApplicationContext applicationContext; @Bean public ExampleBean exampleBean () {vrátiť nový ExampleBean (); } public static void main (String [] args) {applicationContext = new AnnotationConfigApplicationContext (SpringComponentScanApp.class); pre (String beanName: applicationContext.getBeanDefinitionNames ()) {System.out.println (beanName); }}}

Povedzme tiež, že máme Kat a pes komponenty v com.baeldung.componentscan.springapp.animals balenie:

balíček com.baeldung.componentscan.springapp.animals; // ... @Component public class Cat {}
balíček com.baeldung.componentscan.springapp.animals; // ... @Component public class Dog {}

A nakoniec tu máme Rose zložka v com.baeldung.componentscan.springapp.flowers balenie:

balíček com.baeldung.componentscan.springapp.flowers; // ... @Component public class Rose {}

Výstupom z hlavný() metóda bude obsahovať všetky fazule z com.baeldung.componentscan.springapp balíka a jeho čiastkových balíkov:

springComponentScanApp mačka pes príklad ružeBean

Všimnite si, že hlavná trieda aplikácie je tiež fazuľa, ako je anotovaná @ Konfigurácia, čo je a @ Komponent.

Upozorňujeme tiež, že hlavná trieda aplikácie a konfiguračná trieda nie sú nevyhnutne rovnaké. Ak sú odlišné, nezáleží na tom, kam umiestniť hlavnú triedu aplikácií. Pri skenovaní komponentu sa predvolene spustí iba umiestnenie triedy konfigurácie.

Na záver si všimnite, že v našom príklade @ComponentScan je ekvivalentné s:

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

kde basePackages argument je balík alebo pole balíkov na skenovanie.

2.2. Použitím @ComponentScan v aplikácii Spring Boot

Trik v Spring Boot spočíva v tom, že veľa vecí sa deje implicitne. Používame @SpringBootApplication anotácie, ale je to len kombinácia troch anotácií:

@Configuration @EnableAutoConfiguration @ComponentScan

Vytvorme podobnú štruktúru v systéme Windows com.baeldung.componentscan.springbootapp balíček. Tentokrát bude hlavnou aplikáciou:

balíček com.baeldung.componentscan.springbootapp; // ... @SpringBootApplication verejná trieda SpringBootComponentScanApp {private static ApplicationContext applicationContext; @Bean public ExampleBean exampleBean () {vrátiť nový ExampleBean (); } public static void main (String [] args) {applicationContext = SpringApplication.run (SpringBootComponentScanApp.class, args); checkBeansPresence ("mačka", "pes", "ruža", "exampleBean", "springBootComponentScanApp"); } private static void checkBeansPresence (String ... beans) {for (String beanName: beans) {System.out.println ("Is" + beanName + "in ApplicationContext:" + applicationContext.containsBean (beanName)); }}}

Všetky ostatné balíčky a triedy zostávajú rovnaké, iba ich skopírujeme do blízkeho okolia com.baeldung.componentscan.springbootapp balíček.

Spring Boot skenuje balíčky podobne ako v predchádzajúcom príklade. Poďme skontrolovať výstup:

Je mačka v ApplicationContext: true Je pes v ApplicationContext: true Je ruža v ApplicationContext: true Je exampleBean v ApplicationContext: true Je springBootComponentScanApp v ApplicationContext: true

Dôvod, prečo práve kontrolujeme existenciu fazule v našom druhom príklade (na rozdiel od vytlačenia všetkých fazúľ), je ten, že výstup by bol príliš veľký.

Je to z dôvodu implicitného @EnableAutoConfiguration anotácia, vďaka ktorej Spring Boot vytvára veľa fazúľ automaticky, pričom sa spolieha na závislosti v pom.xml spis.

3. @ComponentScan S argumentmi

Teraz si prispôsobme cesty pre skenovanie. Povedzme napríklad, že chceme vylúčiť Rose fazuľa.

3.1. @ComponentScan pre konkrétne balíčky

Môžeme to urobiť niekoľkými spôsobmi. Najskôr môžeme zmeniť základný balík:

@ComponentScan (basePackages = "com.baeldung.componentscan.springapp.animals") @Configuration verejná trieda SpringComponentScanApp {// ...}

Teraz bude výstup:

springComponentScanApp príklad mačacieho psaBean

Pozrime sa, čo je za tým:

  • springComponentScanApp je vytvorené, pretože je to konfigurácia odovzdaná ako argument do AnnotationConfigApplicationContext
  • exampleBean je fazuľa nakonfigurovaná vo vnútri konfigurácie
  • kat a pes sú v zadanom com.baeldung.componentscan.springapp.animals balíček

Všetky vyššie uvedené prispôsobenia sú použiteľné aj v Spring Boot. Môžeme použiť @ComponentScan spolu s @SpringBootApplication a výsledok bude rovnaký:

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

3.2. @ComponentScan s vylúčeniami

Ďalším spôsobom je použitie filtra so zadaním vzoru pre triedy, ktoré sa majú vylúčiť:

@ComponentScan (vylúčiťFiltery = @ ComponentScan.Filter (typ = FilterType.REGEX, vzor = "com \. Baeldung \. Componentscan \. Springapp \. Kvety \ .. *"))

Môžeme tiež zvoliť iný typ filtra, napr anotácia podporuje niekoľko flexibilných možností filtrovania skenovaných tried:

@ComponentScan (excludeFilters = @ ComponentScan.Filter (typ = FilterType.ASSIGNABLE_TYPE, hodnota = Rose.class))

4. Predvolený balík

Mali by sme sa vyhnúť uvedeniu @ Konfigurácia triedy v predvolenom balíku (t. j. tým, že balík vôbec neurčíte). V takom prípade Spring prehľadá všetky triedy vo všetkých pohároch v triede. To spôsobuje chyby a aplikácia sa pravdepodobne nespustí.

5. Záver

V tomto článku sme sa dozvedeli, ktoré balíky predvolene skenuje a ako prispôsobiť tieto cesty.

Celý kód je ako obvykle k dispozícii na serveri GitHub.