SpringBoot3.x中spring.factories功能被移除的解决方案
创始人
2024-03-18 16:17:19

背景

笔者所在项目组在搭建一个全新项目的时候选用了SpringBoot3.x,项目中应用了很多SpringBoot2.x时代相关的第三方组件例如baomidou出品的mybatis-plusdynamic-datasource等。在配置好相关依赖、最小启动类和配置之后,发现项目无法启动。于是根据启动上下文日志和按行DEBUG找到原因并且在等待组件升级兼容之前进行临时性解决。

关于spring.factories

spring.factories其实是SpringBoot提供的SPI机制,底层实现是基于SpringFactoriesLoader检索ClassLoader中所有jar(包括ClassPath下的所有模块)引入的META-INF/spring.factories文件,基于文件中的接口(或者注解)加载对应的实现类并且注册到IOC容器。这种方式对于@ComponentScan不能扫描到的并且想自动注册到IOC容器的使用场景十分合适,基本上绝大多数第三方组件甚至部分spring-projects中编写的组件都是使用这种方案。

96a73a21e2e52377f07bd9b2831dee27.png
sp-3-upgrade-1.png

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.OnWebApplicationConditionorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\
com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

通用格式是:接口(或者注解)全类名=\接口实现类(或者使用了该注解的类)全类名-1,\接口实现类(或者使用了该注解的类)全类名-2,\...接口实现类(或者使用了该注解的类)全类名-nspring.factories中最常用的注解是org.springframework.boot.autoconfigure.EnableAutoConfiguration,通过配置此注解对应的实现了,底层会由AutoConfigurationImportSelector对响应的目标类进行加载和自动注册。通过阅读Spring Boot 3.0 Migration Guide得知,spring.factories功能在Spring Boot 2.7已经废弃,并且会在Spring Boot 3.0移除。

spring.factories被移除后的替代方案

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彻底移除(见下图)

ae220976b50d0dbb5c0fa685b357d74c.png
sp-3-upgrade-2.png

替代方案比较简单,就是在类路径下创建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,文件的内容是:「每个实现类的全类名单独一行」。例如对于使用了(低版本还没适配Spring Boot 3.0mybatis-plusdynamic-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-springdubbo等:

000f54b8cf2ecff43a4d6fd492b81b3a.png
sp-3-upgrade-3.png

这里还没详细分析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 广州基本开放,不需要做核酸了)

上一篇:多线程 3

下一篇:_001_Zotero入门

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...