SpringBoot3 spring.factories自動配置功能不生效的解決
場景說明
原來的SpringBoot 自動配置功能如下,主要是創(chuàng)建spring.factories 文件,在里面寫入你要自動配置的類全路徑。

文件內(nèi)容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.bigshow.starter.sse.config.SseAutoConfigure
其中 SseAutoConfigure 就是你要自動化配置的類:
/**
* SSE服務(wù)端 核心配置類
*
* @author BigShow
*/
@Configuration
@ConditionalOnProperty(prefix = "bigshow.sse", value = "enable", havingValue = "true")
@EnableConfigurationProperties({SseProperties.class})
public class SseAutoConfigure implements InitializingBean {
@Lazy
@Resource
private ApplicationContext applicationContext;
@Bean
@ConditionalOnMissingBean
SseServer sseServer() {
return new SseServer();
}
@Bean
@ConditionalOnMissingBean
public SseBusinessService sseBusinessService() {
return new DefaultSseBusinessServiceImpl();
}
}
該項目打包 mvn clean install 或者 mvn deploy 發(fā)布到maven倉庫中去,
其他應(yīng)用項目直接引入然后在application.yml文件中配置一下即可使用此功能。
<dependency>
<groupId>com.bigshow</groupId>
<artifactId>sse-spring-boot-starter</artifactId>
<version>1.0</version>
</dependency>
bigshow:
sse:
enable: true
但是!從SpringBoot3開始,這樣 spring.factories 自動配置功能不生效了。
原因是:官方做出了改變!
原因說明
Spring Boot 3采用了基于META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件的自動配置加載策略,替代了過去的spring.factories方式
注意:文件名字就是 “org.springframework.boot.autoconfigure.AutoConfiguration.imports”
這個文件里面的內(nèi)容就是你要配置類的全路徑名稱即可:
com.example.autoconfig.MyAutoConfiguration1 com.example.autoconfig.MyAutoConfiguration2 com.example.autoconfig.MyAutoConfiguration3 ...
看到這里不禁要問:這和之前的有什么區(qū)別 ,感覺就是配置文件名稱不一樣了 ? !
從表面上看,確實是這樣,但是這為未來提供了很大的意義:
原來的 spring.factories 文件里面可以做很多其他的事情,它是一個 多功能的配置文件,采用鍵值對形式,內(nèi)部可以聲明多種類型的自動加載內(nèi)容,不只是自動配置類,還包括:
- 監(jiān)聽器(ApplicationListener)
- 環(huán)境后置處理器(EnvironmentPostProcessor)
- ApplicationContextInitializer
- FactoryBean 等等
所以確實,spring.factories文件長期承擔(dān)了很多職責(zé),Spring Boot3通過拆分專用文件來讓自動配置更清晰規(guī)范,也更適合未來演進(jìn),
Spring Boot 3 對 spring.factories 中的自動配置部分做了拆分,但 其他功能和擴(kuò)展點并沒有全部拋棄 spring.factories,而是逐步遷移或沿用不同的新機(jī)制。
| 功能類型 | 以前在 spring.factories 里聲明 | Spring Boot 3 處理方式(現(xiàn)狀) |
|---|---|---|
| 自動配置類(EnableAutoConfiguration) | 在 spring.factories 的 key: org.springframework.boot.autoconfigure.EnableAutoConfiguration | 拆分到 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中聲明類全名 |
| ApplicationListener | spring.factories的org.springframework.context.ApplicationListener | 依然使用 spring.factories 方式聲明,暫時未拆分,未來可能轉(zhuǎn)為模塊化機(jī)制 |
| EnvironmentPostProcessor | spring.factories的org.springframework.boot.env.EnvironmentPostProcessor | 依然通過 spring.factories 聲明繼續(xù)使用 |
| ApplicationContextInitializer | spring.factories的org.springframework.context.ApplicationContextInitializer | 目前依然使用 spring.factories |
| FactoryBean及其他擴(kuò)展類 | spring.factories聲明 | 大多數(shù)依然沿用 spring.factories,具體視擴(kuò)展功能而定 |
簡單總結(jié)過去和現(xiàn)在的配置文件方式對比:
| 方面 | 以前的 spring.factories | 現(xiàn)在的 AutoConfiguration.imports |
|---|---|---|
| 作用范圍 | 多種擴(kuò)展點都在里面聲明 | 只聲明自動配置類 |
| 文件結(jié)構(gòu) | key-value 配置格式 | 純粹類名列表,每行一個全限定類名 |
| 維護(hù)復(fù)雜度 | 可能集中且復(fù)雜 | 簡單、專一,后續(xù)更易擴(kuò)展 |
| 兼容性 | 老版本Spring Boot依賴 | Spring Boot 3及以后版本推薦 |
未來趨勢和新機(jī)制
- Spring 團(tuán)隊計劃逐步拆解 spring.factories 的過度職責(zé),將不同的擴(kuò)展分別拆分到更明確、可維護(hù)的專用文件或基于 Java 模塊系統(tǒng)(JPMS)的機(jī)制中。
- 部分機(jī)制將使用 spring.autoconfigure 專用資源文件,其他高級擴(kuò)展會結(jié)合 SPI(ServiceLoader機(jī)制)、spring/org/springframework/boot 下的專用目錄,或者全新注解驅(qū)動方式實現(xiàn)。
- 但目前絕大多數(shù)非自動配置的擴(kuò)展仍舊通過 spring.factories 管理。
如何遷移老的starter
原自定義的starter工程:
刪除META-INF/spring.factories文件或者停止使用它。
在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中添加你的自動配置類路徑,例如:
com.bigshow.starter.sse.config.SseAutoConfigure
自動配置類里使用@AutoConfiguration替換原來@Configuration和 (Spring Boot 3 官方推薦使用@AutoConfiguration替代以前的@Configuration + @ConditionalOn等組合注解)
@AutoConfiguration
@ConditionalOnProperty(prefix = "bigshow.sse", value = "enable", havingValue = "true")
@EnableConfigurationProperties({SseProperties.class})
public class SseAutoConfigure implements InitializingBean {
...
}
這里簡單說明下:@Configuration 換成 @AutoConfiguration 好處
- 明確標(biāo)識自動配置類身份
- 增強(qiáng)編譯期和IDE的支持
- 更精準(zhǔn)的自動配置加載機(jī)制
- 未來擴(kuò)展和模塊化支持更友好
- 避免潛在的類路徑掃描沖突
- 結(jié)合條件注解效果更可靠
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
設(shè)置JavaScript自動提示-Eclipse/MyEclipse
自動提示需要2個組件,分別是:ext-4.0.2a.jsb2||spket-1.6.16.jar,需要的朋友可以參考下2016-05-05
Spring中Service注入多個實現(xiàn)類的方法詳解
這篇文章主要介紹了Spring中Service注入多個實現(xiàn)類的方法詳解,Spring是一個開源的Java框架,用于構(gòu)建企業(yè)級應(yīng)用程序,它提供了許多功能,如依賴注入、面向切面編程、數(shù)據(jù)訪問、Web開發(fā)等,需要的朋友可以參考下2023-07-07
詳解Spring Security的formLogin登錄認(rèn)證模式
對于一個完整的應(yīng)用系統(tǒng),與登錄驗證相關(guān)的頁面都是高度定制化的,非常美觀而且提供多種登錄方式。這就需要Spring Security支持我們自己定制登錄頁面,也就是本文給大家介紹的formLogin模式登錄認(rèn)證模式,感興趣的朋友跟隨小編一起看看吧2019-11-11
java數(shù)據(jù)隨機(jī)分頁實現(xiàn)方案
本文主要介紹了java數(shù)據(jù)隨機(jī)分頁實現(xiàn)方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Java借助Spire.Doc for Java庫合并Word文檔
在 Java 開發(fā)項目中,經(jīng)常需要將多個 Word 文檔合并成一個完整文件,通過 Spire.Doc for Java 庫,我們可以輕松實現(xiàn)這一操作,下面小編就和大家詳細(xì)介紹一下吧2026-03-03
SpringBoot打包成Docker鏡像的幾種實現(xiàn)方式
Spring Boot是一個用于構(gòu)建獨立的、可執(zhí)行的Spring應(yīng)用程序的框架,結(jié)合使用Spring Boot和Docker,可以方便地將應(yīng)用程序部署到不同的環(huán)境中本文,主要介紹了SpringBoot打包成Docker鏡像的幾種實現(xiàn)方式,感興趣的可以了解一下2024-01-01
SpringSecurity的@EnableWebSecurity注解詳解
這篇文章主要介紹了SpringSecurity的@EnableWebSecurity注解詳解,@EnableWebSecurity是開啟SpringSecurity的默認(rèn)行為,它的上面有一個Import注解導(dǎo)入了WebSecurityConfiguration類,就是往IOC容器中注入了WebSecurityConfiguration這個類,需要的朋友可以參考下2023-11-11

