Tavaszi alkatrész-szkennelés

1. Áttekintés

Ebben az oktatóanyagban az alkatrészek szkennelését tavasszal tárgyaljuk. Amikor tavasszal dolgozunk, feljegyezhetjük osztályainkat annak érdekében, hogy tavaszi babokká váljanak. De ezen kívül meg tudjuk mondani Springnek, hogy hol keresse meg ezeket az annotált osztályokat mivel nem mindegyiküknek kell babgá válnia ebben a bizonyos futásban.

Természetesen van néhány alapértelmezés az alkatrész-szkennelésre, de testreszabhatjuk a csomagokat a kereséshez is.

Először nézzük meg az alapértelmezett beállításokat.

2. @ComponentScan Érvek nélkül

2.1. Használata @ComponentScan tavaszi jelentkezésben

Tavasszal, használjuk a @ComponentScan annotációval együtt @ Konfiguráció annotáció az átvizsgálni kívánt csomagok megadásához. @ComponentScan argumentumok nélkül felszólítja Springet, hogy vizsgálja meg az aktuális csomagot és annak összes alcsomagját.

Tegyük fel, hogy a következők állnak rendelkezésünkre @ Konfiguráció ban ben com.baeldung.componentscan.springapp csomag:

@Configuration @ComponentScan nyilvános osztály SpringComponentScanApp {privát statikus ApplicationContext applicationContext; @Bean public ExampleBean exampleBean () {return new ExampleBean (); } public static void main (String [] args) {applicationContext = új AnnotationConfigApplicationContext (SpringComponentScanApp.class); for (String babnév: applicationContext.getBeanDefinitionNames ()) {System.out.println (babnév); }}}

Tegyük fel, hogy megvan a Macska és Kutya alkatrészek com.baeldung.componentscan.springapp.animals csomag:

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

És végül megvan a Rózsa komponens com.baeldung.componentscan.springapp.flowers csomag:

com.baeldung.componentscan.springapp.flowers csomag; // ... @Komponens nyilvános osztály Rose {}

A kimenet a fő() módszer az összes babot tartalmazza com.baeldung.componentscan.springapp csomag és annak alcsomagjai:

springComponentScanApp macska kutya rózsa példaBean

Ne feledje, hogy a fő alkalmazási osztály szintén bab, mivel azzal van jelölve @Configuration, ami a @Összetevő.

Vegye figyelembe azt is, hogy a fő alkalmazásosztály és a konfigurációs osztály nem feltétlenül azonos. Ha különböznek, akkor nem számít, hová kell tenni a fő alkalmazásosztályt. Csak a konfigurációs osztály helye számít, mivel az összetevők keresése alapértelmezés szerint a csomagjából indul.

Végül vegye figyelembe, hogy példánkban @ComponentScan egyenértékű:

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

hol basePackages argument egy csomag vagy egy csomag tömb a szkenneléshez.

2.2. Használata @ComponentScan tavaszi csomagtartó alkalmazásban

A Spring Boot trükkje az, hogy sok minden implicit módon történik. Használjuk a @SpringBootApplication annotáció, de ez csak három annotáció kombinációja:

@Configuration @EnableAutoConfiguration @ComponentScan

Hozzunk létre hasonló struktúrát a com.baeldung.componentscan.springbootapp csomag. Ezúttal a fő alkalmazás a következő lesz:

com.baeldung.componentscan.springbootapp csomag; // ... @SpringBootApplication public class SpringBootComponentScanApp {private static ApplicationContext applicationContext; @Bean public ExampleBean exampleBean () {return new ExampleBean (); } public static void main (String [] args) {applicationContext = SpringApplication.run (SpringBootComponentScanApp.class, args); checkBeansPresence ("macska", "kutya", "rózsa", "exampleBean", "springBootComponentScanApp"); } private static void checkBeansPresence (String ... bab) {for (String babnév: bab) {System.out.println ("Is" + babnév + "az ApplicationContextben:" + applicationContext.containsBean (babnév)); }}}

Az összes többi csomag és osztály ugyanaz marad, csak átmásoljuk őket a közeli helyre com.baeldung.componentscan.springbootapp csomag.

A Spring Boot az előző példánkhoz hasonlóan átvizsgálja a csomagokat. Ellenőrizzük a kimenetet:

Macska van az ApplicationContext-ben: true Kutya az ApplicationContext-ben: true Az ApplicationContext-ben emelkedett: true Is exampleBean az ApplicationContext-ben: true A springBootComponentScanApp az ApplicationContext-ben: true

Az ok, amiért a babunk létezését csak a második példánkban ellenőrizzük (szemben az összes bab kinyomtatásával), az az, hogy a kimenet túl nagy lenne.

Ennek oka az implicit @EnableAutoConfiguration megjegyzés, amely miatt a Spring Boot sok babot hoz létre automatikusan, a pom.xml fájl.

3. @ComponentScan Érvekkel

Most szabjuk testre a szkennelés útjait. Tegyük fel például, hogy ki akarjuk zárni a Rózsa bab.

3.1. @ComponentScan specifikus csomagokhoz

Néhány módon megtehetjük. Először is megváltoztathatjuk az alapcsomagot:

@ComponentScan (basePackages = "com.baeldung.componentscan.springapp.animals") @Configuration nyilvános osztály SpringComponentScanApp {// ...}

Most a kimenet a következő lesz:

springComponentScanApp macska kutya példaBean

Nézzük, mi áll ennek hátterében:

  • springComponentScanApp a konfiguráció argumentumként továbbítva a AnnotationConfigApplicationContext
  • példaBab a konfiguráció belsejében konfigurált bab
  • macska és kutya a megadottakban vannak com.baeldung.componentscan.springapp.animals csomag

A fent felsorolt ​​összes testreszabás alkalmazható a Spring Boot alkalmazásban is. Tudjuk használni @ComponentScan együtt @SpringBootApplication és az eredmény ugyanaz lesz:

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

3.2. @ComponentScan kizárásokkal

Egy másik módszer egy szűrő használata, amely meghatározza a kizárandó osztályok mintázatát:

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

Választhatunk más szűrőtípust is, as az annotáció számos rugalmas lehetőséget támogat a beolvasott osztályok szűrésére:

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

4. Az alapértelmezett csomag

Kerülnünk kell a @ Konfiguráció osztály az alapértelmezett csomagban (vagyis a csomag egyáltalán nem megadásával). Ebben az esetben Spring minden osztályt átvizsgál az összes edényben egy osztályútvonalon. Ez hibákat okoz, és az alkalmazás valószínűleg nem indul el.

5. Következtetés

Ebben a cikkben megtudtuk, hogy a Spring mely csomagokat vizsgálja alapértelmezés szerint, és hogyan szabhatja testre ezeket az útvonalakat.

Szokás szerint a teljes kód elérhető a GitHubon.