基于ComponentScan注解的掃描范圍及源碼解析
一.ComponentScan注解的默認(rèn)掃描范圍
ComponentScan注解的默認(rèn)掃描范圍是啟動(dòng)程序XxxApplication. java所在目錄及其下的所有子包。
為了方便理解,我們看一下下面這個(gè)圖片。
這個(gè)項(xiàng)目中的啟動(dòng)類(lèi)是:SpringbootApplication.java
該啟動(dòng)類(lèi)所在的目錄是:springboot
那么ComponentScan注解的默認(rèn)掃描范圍是:springboot目錄及其下面的所有子包。
二.如何修改ComponentScan注解的掃描范圍
ComponentScan注解即可以?huà)呙璋?,也可以?huà)呙柚付ǖ念?lèi)。
我們只需要指定一個(gè)包掃描的路徑,就可以實(shí)現(xiàn)更改包掃描路徑的功能了。
1.ComponentScan注解掃描包
@ComponentScan({"com.company.user","com.company.service"})
2.ComponentScan注解掃描類(lèi)。
@ComponentScan(basePackageClasses={XxxService.class})
三.ComponentScan注解
ComponentScan注解中定義了12個(gè)屬性,我們下面詳細(xì)來(lái)看一下。
我們的討論是基于java8的,spring-context的版本是4.3.7。
1.String[] value() default {};
指定包掃描路徑,value屬性的值,就是項(xiàng)目中的一個(gè)具體路徑。
value屬性的類(lèi)型是String數(shù)組,也就是支持一次指定多個(gè)包掃描路徑。
這個(gè)屬性上面添加了一個(gè)注解,@AliasFor("basePackages"),這個(gè)注解的意思就是說(shuō),value這個(gè)屬性等價(jià)于basePackages屬性。
關(guān)于basePackages屬性,下面會(huì)講到。
2.String[] basePackages() default {};
指定包掃描路徑,basePackages屬性的值,就是項(xiàng)目中的一個(gè)具體路徑。
- basePackages屬性的類(lèi)型是String數(shù)組,也就是支持一次指定多個(gè)包掃描路徑。
- basePackages屬性上面添加了一個(gè)注解,@AliasFor("value"),這個(gè)注解的意思就是說(shuō),basePackages這個(gè)屬性等價(jià)于value屬性。
3.Class<?>[] basePackagesClasses() default {};
掃描具體的類(lèi)。
basePackagesClasses屬性的類(lèi)型是Class數(shù)組,也就是說(shuō)支持同時(shí)指定多個(gè)掃描類(lèi)。
4,Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator. class;
配置beanName生成器,默認(rèn)是BeanNameGenerator。
一般情況下,我們都是使用默認(rèn)的beanName生成器,但是Spring實(shí)現(xiàn)了beanName生成器的可配置。
5,Class<? extends ScopeMetaDataResolver> scopeResolver() default AnnotationScopeMetaDataResolver.class;
處理檢測(cè)到的bean的scope范圍。
什么意思呢?
我們都知道spring的bean是有作用域的,默認(rèn)是singleton,這個(gè)默認(rèn)值就是在ScopeMetaData類(lèi)中指定的:
private String scopeName = "singleton";
這個(gè)屬性也是可選配置,默認(rèn)的處理bean作用域的實(shí)現(xiàn)類(lèi)是AnnotationScopeMetaDataResolver.class。
源碼比較簡(jiǎn)單,就是取注解上獲取指定的scope的value值,如果沒(méi)有配置,就是用默認(rèn)的singleton。
6.ScopedProxyMode scopedProxy() default ScopedProxyMode. DEFAULT;
是否為檢測(cè)到的組件生產(chǎn)代理。
ScopedProxyMode是一個(gè)枚舉類(lèi),可選值有四個(gè):
DEFAULT
NO
INTERFACES
TARGET_CLASS
7.String resourcePattern() default """**/*.class";
控制符合組件檢測(cè)條件的類(lèi)文件,默認(rèn)是包掃描下的 **/*.class。
8.boolean useDefaultFilters() default true;
是否對(duì)含有以下注解的類(lèi)開(kāi)啟檢測(cè),默認(rèn)是開(kāi)啟的。
@Component
@Repository
@Service
@Controller
9.ComponentScan.Filter[] includeFilters() default {};
指定某些Filter掃描到的類(lèi)。聽(tīng)起來(lái)有些費(fèi)勁,說(shuō)白了就是指定了類(lèi)型,掃描指定的這些類(lèi)型。
可選類(lèi)型有5種,定義在枚舉類(lèi)FilterType中:
- 第一種:ANNOTATION
- 第二種:ASSIGNABLE_TYPE
- 第三種:ASPECTJ
- 第四種:REGEX,正則表達(dá)式。
- 第五種:CUSTOM,自定義類(lèi)型。
10.ComponentScan.Filter[] excludeFilters() default {};
排除過(guò)濾器掃描的的類(lèi)。
11.boolean lazyInit() default false;
掃描到的類(lèi)是否開(kāi)啟懶加載,默認(rèn)不開(kāi)啟。
12.
@Retention(RetentionPolicy.RUNTIME); @Target({}) public @interface Filter { FilterType type() default FilterType. ANNOTATION; @AliasFor("classes") Class<?>[] value() default {}; @AliasFor("value") Class<?>[] classes() default {}; String[] pattern() default {}; }
ComponentScan的內(nèi)部接口,主要是對(duì)Filter的封裝。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 基于@ComponentScan注解及其XML配置方式
- 關(guān)于@ComponentScan注解的用法及作用說(shuō)明
- SpringBoot中@ComponentScan注解過(guò)濾排除不加載某個(gè)類(lèi)的3種方法
- @AutoConfigurationPackage與@ComponentScan注解區(qū)別
- spring?boot自動(dòng)裝配之@ComponentScan注解用法詳解
- Spring @ComponentScan注解使用案例詳細(xì)講解
- Spring @ComponentScan注解掃描組件原理
- Spring?component-scan?XML配置與@ComponentScan注解配置
相關(guān)文章
Spring Boot中@ConditionalOnProperty的使用方法
這篇文章主要給大家介紹了關(guān)于Spring Boot中@ConditionalOnProperty的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12java學(xué)習(xí)之junit單元測(cè)試案例(經(jīng)典版)
這篇文章主要介紹了java學(xué)習(xí)之junit單元測(cè)試的相關(guān)資料,文中講解了JUnit單元測(cè)試的基本概念、作用、使用assert進(jìn)行驗(yàn)證、覆蓋率分析、BeforeEach和AfterAll的使用、通過(guò)反射和注解實(shí)現(xiàn)測(cè)試,需要的朋友可以參考下2024-12-12java構(gòu)建Stream流的多種方式總結(jié)
Java?8引入了Stream流作為一項(xiàng)新的特性,它是用來(lái)處理集合數(shù)據(jù)的一種函數(shù)式編程方式,本文為大家整理了多種java構(gòu)建Stream流的方式,希望對(duì)大家有所幫助2023-11-11Java8的default和static關(guān)鍵字的使用講解
今天小編就為大家分享一篇關(guān)于Java8的default和static關(guān)鍵字的使用講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01Spring中@Configuration注解的使用場(chǎng)景
這篇文章主要介紹了Spring中@Configuration注解的使用場(chǎng)景,@Configuration注解是從Spring?3.0版本開(kāi)始加入的一個(gè)使Spring能夠支持注解驅(qū)動(dòng)開(kāi)發(fā)的標(biāo)注型注解,主要用于標(biāo)注在類(lèi)上,需要的朋友可以參考下2023-11-11Spring?Boot?DevTools?全局配置學(xué)習(xí)指南
這篇文章主要介紹了Spring?Boot?DevTools?全局配置,注意包括直接重啟項(xiàng)目與devtools重啟的區(qū)別,DevTools配置,DevTools全局配置及trigger-file控制重啟行為的相關(guān)知識(shí),需要的朋友可以參考下2022-03-03詳解Spring mvc DispatchServlet 實(shí)現(xiàn)機(jī)制
本篇文章主要介紹了詳解Spring mvc DispatchServlet 實(shí)現(xiàn)機(jī)制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09Java中Arrays.asList()方法詳解及實(shí)例
這篇文章主要介紹了Java中Arrays.asList()方法將數(shù)組作為列表時(shí)的一些差異的相關(guān)資料,需要的朋友可以參考下2017-06-06