基于ComponentScan注解的掃描范圍及源碼解析
一.ComponentScan注解的默認(rèn)掃描范圍
ComponentScan注解的默認(rèn)掃描范圍是啟動程序XxxApplication. java所在目錄及其下的所有子包。
為了方便理解,我們看一下下面這個圖片。

這個項(xiàng)目中的啟動類是:SpringbootApplication.java
該啟動類所在的目錄是:springboot
那么ComponentScan注解的默認(rèn)掃描范圍是:springboot目錄及其下面的所有子包。
二.如何修改ComponentScan注解的掃描范圍
ComponentScan注解即可以掃描包,也可以掃描指定的類。
我們只需要指定一個包掃描的路徑,就可以實(shí)現(xiàn)更改包掃描路徑的功能了。
1.ComponentScan注解掃描包
@ComponentScan({"com.company.user","com.company.service"})2.ComponentScan注解掃描類。
@ComponentScan(basePackageClasses={XxxService.class})三.ComponentScan注解
ComponentScan注解中定義了12個屬性,我們下面詳細(xì)來看一下。
我們的討論是基于java8的,spring-context的版本是4.3.7。
1.String[] value() default {};
指定包掃描路徑,value屬性的值,就是項(xiàng)目中的一個具體路徑。
value屬性的類型是String數(shù)組,也就是支持一次指定多個包掃描路徑。
這個屬性上面添加了一個注解,@AliasFor("basePackages"),這個注解的意思就是說,value這個屬性等價于basePackages屬性。
關(guān)于basePackages屬性,下面會講到。
2.String[] basePackages() default {};
指定包掃描路徑,basePackages屬性的值,就是項(xiàng)目中的一個具體路徑。
- basePackages屬性的類型是String數(shù)組,也就是支持一次指定多個包掃描路徑。
- basePackages屬性上面添加了一個注解,@AliasFor("value"),這個注解的意思就是說,basePackages這個屬性等價于value屬性。
3.Class<?>[] basePackagesClasses() default {};
掃描具體的類。
basePackagesClasses屬性的類型是Class數(shù)組,也就是說支持同時指定多個掃描類。
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;
處理檢測到的bean的scope范圍。
什么意思呢?
我們都知道spring的bean是有作用域的,默認(rèn)是singleton,這個默認(rèn)值就是在ScopeMetaData類中指定的:
private String scopeName = "singleton";
這個屬性也是可選配置,默認(rèn)的處理bean作用域的實(shí)現(xiàn)類是AnnotationScopeMetaDataResolver.class。
源碼比較簡單,就是取注解上獲取指定的scope的value值,如果沒有配置,就是用默認(rèn)的singleton。
6.ScopedProxyMode scopedProxy() default ScopedProxyMode. DEFAULT;
是否為檢測到的組件生產(chǎn)代理。
ScopedProxyMode是一個枚舉類,可選值有四個:
DEFAULTNOINTERFACESTARGET_CLASS
7.String resourcePattern() default """**/*.class";
控制符合組件檢測條件的類文件,默認(rèn)是包掃描下的 **/*.class。
8.boolean useDefaultFilters() default true;
是否對含有以下注解的類開啟檢測,默認(rèn)是開啟的。
@Component@Repository@Service@Controller
9.ComponentScan.Filter[] includeFilters() default {};
指定某些Filter掃描到的類。聽起來有些費(fèi)勁,說白了就是指定了類型,掃描指定的這些類型。
可選類型有5種,定義在枚舉類FilterType中:
- 第一種:ANNOTATION
- 第二種:ASSIGNABLE_TYPE
- 第三種:ASPECTJ
- 第四種:REGEX,正則表達(dá)式。
- 第五種:CUSTOM,自定義類型。
10.ComponentScan.Filter[] excludeFilters() default {};
排除過濾器掃描的的類。
11.boolean lazyInit() default false;
掃描到的類是否開啟懶加載,默認(rèn)不開啟。
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)部接口,主要是對Filter的封裝。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java避免死鎖_動力節(jié)點(diǎn)Java學(xué)院整理
在有些情況下死鎖是可以避免的。本文將展示三種用于避免死鎖的技術(shù)。對java避免死鎖的相關(guān)知識感興趣的朋友一起通過本文學(xué)習(xí)吧2017-06-06
Springboot手動連接庫并獲取指定表結(jié)構(gòu)的示例代碼
這篇文章主要介紹了Springboot手動連接庫并獲取指定表結(jié)構(gòu)的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
java通過AOP實(shí)現(xiàn)全局日志打印詳解
最近自己一直再看現(xiàn)有微服務(wù)的日志模塊,發(fā)現(xiàn)就是使用AOP來做controller層的日志處理,加上項(xiàng)目在進(jìn)行架構(gòu)優(yōu)化,這篇文章主要給大家介紹了關(guān)于java通過AOP實(shí)現(xiàn)全局日志打印的相關(guān)資料,需要的朋友可以參考下2022-01-01
Spark調(diào)優(yōu)多線程并行處理任務(wù)實(shí)現(xiàn)方式
這篇文章主要介紹了Spark調(diào)優(yōu)多線程并行處理任務(wù)實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
springboot @validated List校驗(yàn)失效問題
這篇文章主要介紹了springboot @validated List校驗(yàn)失效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringCloud微服務(wù)多應(yīng)用腳手架的搭建與部署方式
這篇文章主要介紹了SpringCloud微服務(wù)多應(yīng)用腳手架的搭建與部署方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringBoot整合Ehcache3的實(shí)現(xiàn)步驟
本文主要介紹了SpringBoot整合Ehcache3的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
Java中獲取時間戳的三種方式對比實(shí)現(xiàn)
這篇文章主要介紹了Java中獲取時間戳的三種方式對比實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

