SpringBoot默認包掃描機制及@ComponentScan指定掃描路徑詳解
SpringBoot默認包掃描機制
標註瞭@Component和@Component的衍生註解如@Controller,@Service,@Repository就可以把當前的Bean加入到IOC容器中。那麼SpringBoot是如何知道要去掃描@Component註解的呢。@ComponentScan做的事情就是告訴Spring從哪裡找到bean
SpringBoot默認包掃描機制: 從啟動類所在包開始,掃描當前包及其子級包下的所有文件。我們可以通過以下的測試來驗證一下。
啟動應用並訪問BannerController這個控制器,目錄結構如圖
訪問結果正常
當把BannerController移動到上一級目錄,應用可以正常啟動
但是再次訪問剛才的路徑時卻出現瞭如下錯誤,代碼是沒有變動的,是Controller掃描 不到瞭。
實際上SpringBoot是通過@ComponentScan進行掃描。默認情況下,入口類上面的@SpringBootApplication裡面有一個@ComponentScan,也就相當於@ComponentScan標註在入口類上。
所以默認情況下,掃描入口類同級及其子級包下的所有文件。當我們想自己制定包掃描路徑就需要加一個@ComponentScan
@ComponentScan的使用
常用參數含義
basePackages
與value
: 用於指定包的路徑,進行掃描(默認參數)basePackageClasses
: 用於指定某個類的包的路徑進行掃描includeFilters
: 包含的過濾條件FilterType.ANNOTATION
:按照註解過濾FilterType.ASSIGNABLE_TYPE
:按照給定的類型FilterType.ASPECTJ
:使用ASPECTJ表達式FilterType.REGEX
:正則FilterType.CUSTOM
:自定義規則excludeFilters
: 排除的過濾條件,用法和includeFilters一樣nameGenerator
: bean的名稱的生成器useDefaultFilters
: 是否開啟對@Component,@Repository,@Service,@Controller的類進行檢測
指定要掃描的包
上述例子,如果想掃描啟動類上一級包,使用@ComponentScan指定包掃描路徑,即可將BannerController加入到容器
@SpringBootApplication @ComponentScan("com.lin") public class MissyouApplication { public static void main(String[] args) { SpringApplication.run(MissyouApplication.class, args); } }
excludeFilters 排除某些包的掃描
測試類準備:
@Controller public class BannerController { BannerController(){ System.out.println("Hello BannerController"); } } -------------------------------------------------------------------- @Service public class TestService { TestService(){ System.out.println("Hello TestService"); } }
目錄結構如下:
啟動類上加@ComponentScan指定掃描lin這個包並排除@Controller這個註解標註的類
@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); } }
啟動應用,控制臺打印出瞭TestService而沒有BannerController
@Component與@ComponentScan
在某個類上使用@Component註解,表明當需要創建類時,這個被註解標註的類是一個候選類。就像是有同學在舉手。 @ComponentScan 用於掃描指定包下的類。就像看都有哪些舉手瞭。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- springboot 啟動如何排除某些bean的註入
- Spring Boot 排除某個類加載註入IOC的操作
- Springboot項目實現將類從@ComponentScan中排除
- 基於@ComponentScan註解的使用詳解
- 詳解Spring系列之@ComponentScan自動掃描組件