SpringBoot默認(rèn)包掃描機(jī)制及@ComponentScan指定掃描路徑詳解
SpringBoot默認(rèn)包掃描機(jī)制
標(biāo)注了@Component和@Component的衍生注解如@Controller,@Service,@Repository就可以把當(dāng)前的Bean加入到IOC容器中。那么SpringBoot是如何知道要去掃描@Component注解的呢。@ComponentScan做的事情就是告訴Spring從哪里找到bean
SpringBoot默認(rèn)包掃描機(jī)制: 從啟動(dòng)類所在包開始,掃描當(dāng)前包及其子級(jí)包下的所有文件。我們可以通過(guò)以下的測(cè)試來(lái)驗(yàn)證一下。
啟動(dòng)應(yīng)用并訪問(wèn)BannerController這個(gè)控制器,目錄結(jié)構(gòu)如圖
訪問(wèn)結(jié)果正常
當(dāng)把BannerController移動(dòng)到上一級(jí)目錄,應(yīng)用可以正常啟動(dòng)
但是再次訪問(wèn)剛才的路徑時(shí)卻出現(xiàn)了如下錯(cuò)誤,代碼是沒(méi)有變動(dòng)的,是Controller掃描 不到了。
實(shí)際上SpringBoot是通過(guò)@ComponentScan進(jìn)行掃描。默認(rèn)情況下,入口類上面的@SpringBootApplication里面有一個(gè)@ComponentScan,也就相當(dāng)于@ComponentScan標(biāo)注在入口類上。
所以默認(rèn)情況下,掃描入口類同級(jí)及其子級(jí)包下的所有文件。當(dāng)我們想自己制定包掃描路徑就需要加一個(gè)@ComponentScan
@ComponentScan的使用
常用參數(shù)含義
basePackages
與value
: 用于指定包的路徑,進(jìn)行掃描(默認(rèn)參數(shù))basePackageClasses
: 用于指定某個(gè)類的包的路徑進(jìn)行掃描includeFilters
: 包含的過(guò)濾條件FilterType.ANNOTATION
:按照注解過(guò)濾FilterType.ASSIGNABLE_TYPE
:按照給定的類型FilterType.ASPECTJ
:使用ASPECTJ表達(dá)式FilterType.REGEX
:正則FilterType.CUSTOM
:自定義規(guī)則excludeFilters
: 排除的過(guò)濾條件,用法和includeFilters一樣nameGenerator
: bean的名稱的生成器useDefaultFilters
: 是否開啟對(duì)@Component,@Repository,@Service,@Controller的類進(jìn)行檢測(cè)
指定要掃描的包
上述例子,如果想掃描啟動(dòng)類上一級(jí)包,使用@ComponentScan指定包掃描路徑,即可將BannerController加入到容器
@SpringBootApplication @ComponentScan("com.lin") public class MissyouApplication { public static void main(String[] args) { SpringApplication.run(MissyouApplication.class, args); } }
excludeFilters 排除某些包的掃描
測(cè)試類準(zhǔn)備:
@Controller public class BannerController { BannerController(){ System.out.println("Hello BannerController"); } } -------------------------------------------------------------------- @Service public class TestService { TestService(){ System.out.println("Hello TestService"); } }
目錄結(jié)構(gòu)如下:
啟動(dòng)類上加@ComponentScan指定掃描lin這個(gè)包并排除@Controller這個(gè)注解標(biāo)注的類
@SpringBootApplication @ComponentScan(value = "com.lin", excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class})}) public class MissyouApplication { public static void main(String[] args) { SpringApplication.run(MissyouApplication.class, args); } }
啟動(dòng)應(yīng)用,控制臺(tái)打印出了TestService而沒(méi)有BannerController
@Component與@ComponentScan
在某個(gè)類上使用@Component注解,表明當(dāng)需要?jiǎng)?chuàng)建類時(shí),這個(gè)被注解標(biāo)注的類是一個(gè)候選類。就像是有同學(xué)在舉手。 @ComponentScan 用于掃描指定包下的類。就像看都有哪些舉手了。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java數(shù)據(jù)類型之細(xì)講char類型與編碼關(guān)系
這幾天一直在復(fù)習(xí)Java基礎(chǔ)知識(shí),特地寫了一篇文章來(lái)做一下筆記,文中有非常詳細(xì)的圖文示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05redis分布式鎖RedissonLock的實(shí)現(xiàn)細(xì)節(jié)解析
這篇文章主要介紹了redis分布式鎖RedissonLock的實(shí)現(xiàn)細(xì)節(jié)解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06SSM項(xiàng)目使用攔截器實(shí)現(xiàn)登錄驗(yàn)證功能
這篇文章主要介紹了在SSM項(xiàng)目中如何使用攔截器,實(shí)現(xiàn)登錄驗(yàn)證功能。文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的小伙伴可以了解一下2022-01-01Java中定時(shí)任務(wù)的全方位場(chǎng)景實(shí)現(xiàn)思路分析
在開發(fā)過(guò)程中,根據(jù)需求和業(yè)務(wù)的不同經(jīng)常會(huì)有很多場(chǎng)景需要用到不同特性的定時(shí)任務(wù),本文將針對(duì)這些場(chǎng)景,提供不同的一個(gè)實(shí)現(xiàn)思路,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2023-12-12使用CI/CD工具Github Action發(fā)布jar到Maven中央倉(cāng)庫(kù)的詳細(xì)介紹
今天通過(guò)對(duì)Github Action的簡(jiǎn)單使用來(lái)介紹了CI/CD的作用,這個(gè)技術(shù)體系是項(xiàng)目集成交付的趨勢(shì),也是面試中的一個(gè)亮點(diǎn)技能。 而且這種方式可以實(shí)現(xiàn)“一次配置,隨時(shí)隨地集成部署”,感興趣的朋友一起看看吧2021-07-07JUC系列學(xué)習(xí)工具類CountDownLatch詳解
這篇文章主要介紹了JUC系列學(xué)習(xí)工具類CountDownLatch詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可任意參考一下2022-08-08Springboot結(jié)合Flowable實(shí)現(xiàn)工作流開發(fā)
本文主要介紹了Springboot結(jié)合Flowable實(shí)現(xiàn)工作流開發(fā),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01