關(guān)于SpringBoot3.x中spring.factories功能被移除的解決方案
背景
筆者所在項(xiàng)目組在搭建一個全新項(xiàng)目的時候選用了SpringBoot3.x
,項(xiàng)目中應(yīng)用了很多SpringBoot2.x
時代相關(guān)的第三方組件例如baomidou
出品的mybatis-plus
、dynamic-datasource
等。在配置好相關(guān)依賴、最小啟動類和配置之后,發(fā)現(xiàn)項(xiàng)目無法啟動。于是根據(jù)啟動上下文日志和按行DEBUG
找到原因并且在等待組件升級兼容之前進(jìn)行臨時性解決。
關(guān)于spring.factories
spring.factories
其實(shí)是SpringBoot
提供的SPI
機(jī)制,底層實(shí)現(xiàn)是基于SpringFactoriesLoader
檢索ClassLoader
中所有jar
(包括ClassPath
下的所有模塊)引入的META-INF/spring.factories
文件,基于文件中的接口(或者注解)加載對應(yīng)的實(shí)現(xiàn)類并且注冊到IOC
容器。這種方式對于@ComponentScan
不能掃描到的并且想自動注冊到IOC
容器的使用場景十分合適,基本上絕大多數(shù)第三方組件甚至部分spring-projects
中編寫的組件都是使用這種方案。
spring.factories
文件的格式大致如下:
# Initializers org.springframework.context.ApplicationContextInitializer=\ org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\ org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener # Application Listeners org.springframework.context.ApplicationListener=\ org.springframework.boot.autoconfigure.BackgroundPreinitializer # Environment Post Processors org.springframework.boot.env.EnvironmentPostProcessor=\ org.springframework.boot.autoconfigure.integration.IntegrationPropertiesEnvironmentPostProcessor # Auto Configuration Import Listeners org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\ org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener # Auto Configuration Import Filters org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\ org.springframework.boot.autoconfigure.condition.OnBeanCondition,\ org.springframework.boot.autoconfigure.condition.OnClassCondition,\ org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\ com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration
通用格式是:接口(或者注解)全類名=\接口實(shí)現(xiàn)類(或者使用了該注解的類)全類名-1,\接口實(shí)現(xiàn)類(或者使用了該注解的類)全類名-2,\...接口實(shí)現(xiàn)類(或者使用了該注解的類)全類名-n
。spring.factories
中最常用的注解是org.springframework.boot.autoconfigure.EnableAutoConfiguration
,通過配置此注解對應(yīng)的實(shí)現(xiàn)了,底層會由AutoConfigurationImportSelector
對響應(yīng)的目標(biāo)類進(jìn)行加載和自動注冊。通過閱讀Spring Boot 3.0 Migration Guide得知,spring.factories
功能在Spring Boot 2.7
已經(jīng)廢棄,并且會在Spring Boot 3.0
移除。
spring.factories被移除后的替代方案
Spring Boot 2.x
升級到Spring Boot 3.0
其實(shí)是一個"破壞性"升級,目前來看相對較大的影響是:
- 必須使用
JDK17
Jakarta EE
的引入,導(dǎo)致很多舊的類包名稱改變- 部分類被徹底移除
spring-data
模塊的所有配置屬性必須使用spring.data
前綴,例如spring.redis.host
必須更變?yōu)?code>spring.data.redis.hostspring.factories
功能在Spring Boot 2.7
已經(jīng)廢棄,在Spring Boot 3.0
徹底移除(見下圖)
替代方案比較簡單,就是在類路徑下創(chuàng)建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件,文件的內(nèi)容是:每個實(shí)現(xiàn)類的全類名單獨(dú)一行。例如對于使用了(低版本還沒適配Spring Boot 3.0
)mybatis-plus
、dynamic-datasource
組件的場景,可以在項(xiàng)目某個模塊的resources
目錄下建立META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件,輸入以下內(nèi)容:
com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration
對于某些社區(qū)熱度比較高的組件近期可以密切關(guān)注其基于Spring Boot 3.0
適配的版本發(fā)布,例如mybatis-spring
、dubbo
等:
這里還沒詳細(xì)分析META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports的源碼實(shí)現(xiàn),從描述和文件名來看,大致看出它在使用上跟原來的spring.factories文件中編寫org.springframework.boot.autoconfigure.EnableAutoConfiguration是相同的
小結(jié)
Spring Boot 3.0
的升級門檻比較高。目前來看spring.factories
功能的移除個人認(rèn)為是本次版本升級的最大影響因素,有可能導(dǎo)致大部分第三方編寫過自動注冊板塊的組件全部失效。當(dāng)然,JDK17
也是一個比較高的門檻,對于大部分有歷史包袱的項(xiàng)目如果決定升級需要極大的容器。建議先觀望和關(guān)注團(tuán)隊(duì)用到的技術(shù)?;蛘呖蚣芏歼m配Spring Boot 3.0
后再進(jìn)行版本升級。
到此這篇關(guān)于SpringBoot3.x中spring.factories功能被移除的解決方案的文章就介紹到這了,更多相關(guān)SpringBoot3.x中spring.factories功能移除內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring中的spring.factories文件用法(Spring如何加載第三方Bean)
- springboot自動配置原理以及spring.factories文件的作用詳解
- springboot 加載 META-INF/spring.factories方式
- SpringBoot借助spring.factories文件跨模塊實(shí)例化Bean
- SpringBoot?spring.factories加載時機(jī)分析
- springBoot?之spring.factories擴(kuò)展機(jī)制示例解析
- SpringBoot 自動掃描第三方包及spring.factories失效的問題解決
- SpringBoot3.x中spring.factories?SPI?服務(wù)發(fā)現(xiàn)機(jī)制的改變問題小結(jié)
- SpringBoot之spring.factories的使用方式
- 在SpringBoot3中spring.factories配置不起作用的原因和解決方法
- 淺談spring.factories文件的作用
相關(guān)文章
詳解java JDK 動態(tài)代理類分析(java.lang.reflect.Proxy)
這篇文章主要介紹了詳解java JDK 動態(tài)代理類分析(java.lang.reflect.Proxy)的相關(guān)資料,需要的朋友可以參考下2017-06-06Java請求Http接口OkHttp超詳細(xì)講解(附帶工具類)
這篇文章主要給大家介紹了關(guān)于Java請求Http接口OkHttp超詳細(xì)講解的相關(guān)資料,OkHttp是一款優(yōu)秀的HTTP客戶端框架,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02Mybatis-Plus讀寫Mysql的Json字段的操作代碼
這篇文章主要介紹了Mybatis-Plus讀寫Mysql的Json字段的操作代碼,文中通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04Spring Boot中數(shù)據(jù)庫操作Druid和HikariDataSource的詳細(xì)過程
這篇文章主要介紹了Spring Boot中數(shù)據(jù)庫操作Druid和HikariDataSource的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06