筆者所在專案組在搭建一個全新專案的時候選用了SpringBoot3.x
,專案中應用了很多SpringBoot2.x
時代相關的第三方元件例如baomidou
出品的mybatis-plus
、dynamic-datasource
等。在設定好相關依賴、最小啟動類和設定之後,發現專案無法啟動。於是根據啟動上下文紀錄檔和按行DEBUG
找到原因並且在等待元件升級相容之前進行臨時性解決。
spring.factories
其實是SpringBoot
提供的SPI
機制,底層實現是基於SpringFactoriesLoader
檢索ClassLoader
中所有jar
(包括ClassPath
下的所有模組)引入的META-INF/spring.factories
檔案,基於檔案中的介面(或者註解)載入對應的實現類並且註冊到IOC
容器。這種方式對於@ComponentScan
不能掃描到的並且想自動註冊到IOC
容器的使用場景十分合適,基本上絕大多數第三方元件甚至部分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
通用格式是:介面(或者註解)全類名=\介面實現類(或者使用了該註解的類)全類名-1,\介面實現類(或者使用了該註解的類)全類名-2,\...介面實現類(或者使用了該註解的類)全類名-n
。spring.factories
中最常用的註解是org.springframework.boot.autoconfigure.EnableAutoConfiguration
,通過設定此註解對應的實現了,底層會由AutoConfigurationImportSelector
對響應的目標類進行載入和自動註冊。通過閱讀Spring Boot 3.0 Migration Guide得知,spring.factories
功能在Spring Boot 2.7
已經廢棄,並且會在Spring Boot 3.0
移除。
Spring Boot 2.x
升級到Spring Boot 3.0
其實是一個"破壞性"升級,目前來看相對較大的影響是:
JDK17
Jakarta EE
的引入,導致很多舊的類包名稱改變spring-data
模組的所有設定屬性必須使用spring.data
字首,例如spring.redis.host
必須更變為spring.data.redis.host
spring.factories
功能在Spring Boot 2.7
已經廢棄,在Spring Boot 3.0
徹底移除(見下圖)替代方案比較簡單,就是在類路徑下建立META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
檔案,檔案的內容是:每個實現類的全類名單獨一行。例如對於使用了(低版本還沒適配Spring Boot 3.0
)mybatis-plus
、dynamic-datasource
元件的場景,可以在專案某個模組的resources
目錄下建立META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
檔案,輸入以下內容:
com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration
com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration
com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration
對於某些社群熱度比較高的元件近期可以密切關注其基於Spring Boot 3.0
適配的版本釋出,例如mybatis-spring
、dubbo
等:
這裡還沒詳細分析META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports的原始碼實現,從描述和檔名來看,大致看出它在使用上跟原來的spring.factories檔案中編寫org.springframework.boot.autoconfigure.EnableAutoConfiguration是相同的
Spring Boot 3.0
的升級門檻比較高。目前來看spring.factories
功能的移除個人認為是本次版本升級的最大影響因素,有可能導致大部分第三方編寫過自動註冊板塊的元件全部失效。當然,JDK17
也是一個比較高的門檻,對於大部分有歷史包袱的專案如果決定升級需要極大的容器。建議先觀望和關注團隊用到的技術棧或者框架都適配Spring Boot 3.0
後再進行版本升級。
(c-1-d e-a-20221204 廣州基本開放,不需要做核酸了)