解決使用@Component會導(dǎo)致spring.factories中的EnableAutoConfiguration無效問題
使用@Component會導(dǎo)致spring.factories中的EnableAutoConfiguration無效
本文基于SpringBoot 2.6.0分析,(但實(shí)際上目前所有版本都存在這個(gè)問題),使用@Component會導(dǎo)致spring.factories中的EnableAutoConfiguration無效
在spring.factories中通過org.springframework.boot.autoconfigure.EnableAutoConfiguration配置自動裝配類時(shí),bean名稱是全類名。
加上如下兩個(gè)注解都不會出現(xiàn)被實(shí)例化兩次的問題
- 1.
@Configuration - 2.
@Component
但使用@Component注解會導(dǎo)致在spring.factories中配置的無效,bean名稱變?yōu)轭惷鬃帜感?,?code>@Configuration不會,
原因是:
- 在做類路徑bean掃描時(shí),會過濾掉含
@Configuration并配置在spring.factories中的類 - 參見:
org.springframework.boot.autoconfigure.AutoConfigurationExcludeFilter,由AutoConfigurationImportSelector去加載。
@Configuration
//@Component
public class MyCustomAutoConfiguration {
public MyCustomAutoConfiguration() {
System.out.println(MyCustomAutoConfiguration.class.getName() + " init...");
}
}為什么類上標(biāo)記@Component會導(dǎo)致其在spring.factories中配置無效
原因在:
- 于Spring執(zhí)行包掃描的時(shí)候,會將掃描的類包裝成
ConfigurationClass進(jìn)行解析,解析之前會從Map(ConfigurationClassParser#configurationClasses)中獲取判斷之前是否已經(jīng)解析過,如果已經(jīng)解析過則跳過,解析之后會存放到Map中保存。 - 當(dāng)使用
@Component會被Spring掃描到, 之后AutoConfigurationImportSelector加載spring.factories中的EnableAutoConfiguration時(shí)雖然能加載到,但是在處理時(shí)判斷之前實(shí)際上已經(jīng)處理過,所以不再被處理。

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合Shiro兩種方式(總結(jié))
這篇文章主要介紹了SpringBoot整合Shiro兩種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
IntelliJ IDEA將導(dǎo)入的項(xiàng)目轉(zhuǎn)成maven項(xiàng)目
這篇文章主要介紹了IntelliJ IDEA將導(dǎo)入的項(xiàng)目轉(zhuǎn)成maven項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
SpringBoot利用自定義注解實(shí)現(xiàn)隱私數(shù)據(jù)脫敏(加密顯示)的解決方案
這兩天在整改等保測出的問題,里面有一個(gè)“用戶信息泄露”的風(fēng)險(xiǎn)項(xiàng)(就是后臺系統(tǒng)里用戶的一些隱私數(shù)據(jù)直接明文顯示了),其實(shí)指的就是要做數(shù)據(jù)脫敏,本文給大家介紹了SpringBoot利用自定義注解實(shí)現(xiàn)隱私數(shù)據(jù)脫敏(加密顯示)的解決方案,需要的朋友可以參考下2023-11-11
Java基于API接口爬取商品數(shù)據(jù)的示例代碼
Java作為一種流行的編程語言,可以用于編寫程序來調(diào)用這些API接口,從而獲取商品數(shù)據(jù),本文將介紹如何使用Java基于API接口爬取商品數(shù)據(jù),包括請求API、解析JSON數(shù)據(jù)、存儲數(shù)據(jù)等步驟,并提供相應(yīng)的代碼示例,感興趣的朋友跟隨小編一起看看吧2023-10-10
Java調(diào)用SQL腳本執(zhí)行常用的方法示例
這篇文章主要給大家介紹了關(guān)于Java調(diào)用SQL腳本執(zhí)行常用的方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
SpringBoot項(xiàng)目沒有把依賴的jar包一起打包的問題解決
這篇文章主要介紹了SpringBoot項(xiàng)目沒有把依賴的jar包一起打包的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09

