解決使用@Component會導致spring.factories中的EnableAutoConfiguration無效問題
使用@Component會導致spring.factories中的EnableAutoConfiguration無效
本文基于SpringBoot 2.6.0分析,(但實際上目前所有版本都存在這個問題),使用@Component會導致spring.factories中的EnableAutoConfiguration無效
在spring.factories中通過org.springframework.boot.autoconfigure.EnableAutoConfiguration配置自動裝配類時,bean名稱是全類名。
加上如下兩個注解都不會出現(xiàn)被實例化兩次的問題
- 1.
@Configuration
- 2.
@Component
但使用@Component
注解會導致在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..."); } }
為什么類上標記@Component會導致其在spring.factories中配置無效
原因在:
- 于Spring執(zhí)行包掃描的時候,會將掃描的類包裝成
ConfigurationClass
進行解析,解析之前會從Map(ConfigurationClassParser#configurationClasses
)中獲取判斷之前是否已經(jīng)解析過,如果已經(jīng)解析過則跳過,解析之后會存放到Map中保存。 - 當使用
@Component
會被Spring掃描到, 之后AutoConfigurationImportSelector
加載spring.factories
中的EnableAutoConfiguration
時雖然能加載到,但是在處理時判斷之前實際上已經(jīng)處理過,所以不再被處理。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java實現(xiàn)動態(tài)數(shù)據(jù)源切換的實踐指南
在 Java 開發(fā)中,許多場景需要訪問多個數(shù)據(jù)庫,例如多租戶系統(tǒng)或讀寫分離架構,為了靈活高效地管理這些場景,動態(tài)數(shù)據(jù)源切換技術應運而生,所以本文給大家介紹了Java實現(xiàn)動態(tài)數(shù)據(jù)源切換的實踐指南,需要的朋友可以參考下2025-03-03Java利用Jackson序列化實現(xiàn)數(shù)據(jù)脫敏
這篇文章主要介紹了利用Jackson序列化實現(xiàn)數(shù)據(jù)脫敏,首先在需要進行脫敏的VO字段上面標注相關脫敏注解,具體實例代碼文中給大家介紹的非常詳細,需要的朋友可以參考下2021-10-10