解決使用@Component會導(dǎo)致spring.factories中的EnableAutoConfiguration無效問題
使用@Component會導(dǎo)致spring.factories中的EnableAutoConfiguration無效
本文基于SpringBoot 2.6.0分析,(但實(shí)際上目前所有版本都存在這個問題),使用@Component會導(dǎo)致spring.factories中的EnableAutoConfiguration無效
在spring.factories中通過org.springframework.boot.autoconfigure.EnableAutoConfiguration配置自動裝配類時,bean名稱是全類名。
加上如下兩個注解都不會出現(xiàn)被實(shí)例化兩次的問題
- 1.
@Configuration
- 2.
@Component
但使用@Component
注解會導(dǎo)致在spring.factories
中配置的無效,bean名稱變?yōu)轭惷鬃帜感?,?code>@Configuration不會,
原因是:
- 在做類路徑bean掃描時,會過濾掉含
@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í)行包掃描的時候,會將掃描的類包裝成
ConfigurationClass
進(jìn)行解析,解析之前會從Map(ConfigurationClassParser#configurationClasses
)中獲取判斷之前是否已經(jīng)解析過,如果已經(jīng)解析過則跳過,解析之后會存放到Map中保存。 - 當(dāng)使用
@Component
會被Spring掃描到, 之后AutoConfigurationImportSelector
加載spring.factories
中的EnableAutoConfiguration
時雖然能加載到,但是在處理時判斷之前實(shí)際上已經(jīng)處理過,所以不再被處理。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)動態(tài)數(shù)據(jù)源切換的實(shí)踐指南
在 Java 開發(fā)中,許多場景需要訪問多個數(shù)據(jù)庫,例如多租戶系統(tǒng)或讀寫分離架構(gòu),為了靈活高效地管理這些場景,動態(tài)數(shù)據(jù)源切換技術(shù)應(yīng)運(yùn)而生,所以本文給大家介紹了Java實(shí)現(xiàn)動態(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é)構(gòu)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡單樹結(jié)構(gòu)的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01