日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解

發布時間:2025/3/12 javascript 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 用于掃描指定包下的類。就像看都有哪些舉手了。




springboot多模塊包掃描問題的解決方法

問題描述:

springboot建立多個模塊,當一個模塊需要使用另一個模塊的服務時,需要注入另一個模塊的組件,如下面圖中例子:

memberservice模塊中的MemberServiceApiImpl類需要注入common模塊中的RedisService組件,該怎么注入呢?

解決:

在memberservice模塊的啟動類上加上RedisService類所在包的全路徑的組件掃描,就像這樣:

注意啟動類上方的注解@ComponentScan(basePackages={“com.whu.commom.redis”}),這一句實際上就已經加上了RedisService的組件掃描,但是這樣做是有問題的,我發現啟動后服務不能正常訪問。查找資料后發現是因為@ComponentScan 和@SpringBootApplication注解的包掃描有沖突,@ComponentScan注解包掃描會覆蓋掉@SpringBootApplication的包掃描。解決辦法就是在@ComponentScan(basePackages={“com.whu.commom.redis”})的基礎上加上@SpringBootApplication掃描的包,那么@SpringBootApplication掃描了哪些包呢?實際上,它默認掃描的是啟動類所在的包及其子包,所以我的例子上需要改成@ComponentScan(basePackages={“com.whu.commom.redis”,“com.whu.memberservice”}). OK ,結束!!

總結

以上是生活随笔為你收集整理的SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。