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

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

