解決使用@Component會(huì)導(dǎo)致spring.factories中的EnableAutoConfiguration無(wú)效問(wèn)題
使用@Component會(huì)導(dǎo)致spring.factories中的EnableAutoConfiguration無(wú)效
本文基于SpringBoot 2.6.0分析,(但實(shí)際上目前所有版本都存在這個(gè)問(wèn)題),使用@Component會(huì)導(dǎo)致spring.factories中的EnableAutoConfiguration無(wú)效
在spring.factories中通過(guò)org.springframework.boot.autoconfigure.EnableAutoConfiguration配置自動(dòng)裝配類時(shí),bean名稱是全類名。
加上如下兩個(gè)注解都不會(huì)出現(xiàn)被實(shí)例化兩次的問(wèn)題
- 1.
@Configuration
- 2.
@Component
但使用@Component
注解會(huì)導(dǎo)致在spring.factories
中配置的無(wú)效,bean名稱變?yōu)轭惷鬃帜感?,?code>@Configuration不會(huì),
原因是:
- 在做類路徑bean掃描時(shí),會(huì)過(guò)濾掉含
@Configuration
并配置在spring.factories
中的類 - 參見(jiàn):
org.springframework.boot.autoconfigure.AutoConfigurationExcludeFilter
,由AutoConfigurationImportSelector
去加載。
@Configuration //@Component public class MyCustomAutoConfiguration { public MyCustomAutoConfiguration() { System.out.println(MyCustomAutoConfiguration.class.getName() + " init..."); } }
為什么類上標(biāo)記@Component會(huì)導(dǎo)致其在spring.factories中配置無(wú)效
原因在:
- 于Spring執(zhí)行包掃描的時(shí)候,會(huì)將掃描的類包裝成
ConfigurationClass
進(jìn)行解析,解析之前會(huì)從Map(ConfigurationClassParser#configurationClasses
)中獲取判斷之前是否已經(jīng)解析過(guò),如果已經(jīng)解析過(guò)則跳過(guò),解析之后會(huì)存放到Map中保存。 - 當(dāng)使用
@Component
會(huì)被Spring掃描到, 之后AutoConfigurationImportSelector
加載spring.factories
中的EnableAutoConfiguration
時(shí)雖然能加載到,但是在處理時(shí)判斷之前實(shí)際上已經(jīng)處理過(guò),所以不再被處理。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
不知道面試會(huì)不會(huì)問(wèn)Lambda怎么用(推薦)
這篇文章主要介紹了Lambda表達(dá)式用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的實(shí)踐指南
在 Java 開(kāi)發(fā)中,許多場(chǎng)景需要訪問(wèn)多個(gè)數(shù)據(jù)庫(kù),例如多租戶系統(tǒng)或讀寫分離架構(gòu),為了靈活高效地管理這些場(chǎng)景,動(dòng)態(tài)數(shù)據(jù)源切換技術(shù)應(yīng)運(yùn)而生,所以本文給大家介紹了Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的實(shí)踐指南,需要的朋友可以參考下2025-03-03Java利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏
這篇文章主要介紹了利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏,首先在需要進(jìn)行脫敏的VO字段上面標(biāo)注相關(guān)脫敏注解,具體實(shí)例代碼文中給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10Java實(shí)現(xiàn)簡(jiǎn)單樹結(jié)構(gòu)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單樹結(jié)構(gòu)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01