关于SpringBoot3.x中spring.factories功能被移除的解决方案
背景
笔者所在项目组在搭建一个全新项目的时候选用了SpringBoot3.x
,项目中应用了很多SpringBoot2.x
时代相关的第三方组件例如baomidou
出品的mybatis-plus
、dynamic-datasource
等。在配置好相关依赖、最小启动类和配置之后,发现项目无法启动。于是根据启动上下文日志和按行DEBUG
找到原因并且在等待组件升级兼容之前进行临时性解决。
关于spring.factories
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.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
彻底移除(见下图)
替代方案比较简单,就是在类路径下创建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
后再进行版本升级。
到此这篇关于SpringBoot3.x中spring.factories功能被移除的解决方案的文章就介绍到这了,更多相关SpringBoot3.x中spring.factories功能移除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
- Spring中的spring.factories文件用法(Spring如何加载第三方Bean)
- springboot自动配置原理以及spring.factories文件的作用详解
- springboot 加载 META-INF/spring.factories方式
- SpringBoot借助spring.factories文件跨模块实例化Bean
- SpringBoot spring.factories加载时机分析
- springBoot 之spring.factories扩展机制示例解析
- SpringBoot 自动扫描第三方包及spring.factories失效的问题解决
- SpringBoot3.x中spring.factories SPI 服务发现机制的改变问题小结
- SpringBoot之spring.factories的使用方式
- 在SpringBoot3中spring.factories配置不起作用的原因和解决方法
- 浅谈spring.factories文件的作用
相关文章
详解java JDK 动态代理类分析(java.lang.reflect.Proxy)
这篇文章主要介绍了详解java JDK 动态代理类分析(java.lang.reflect.Proxy)的相关资料,需要的朋友可以参考下2017-06-06Java请求Http接口OkHttp超详细讲解(附带工具类)
这篇文章主要给大家介绍了关于Java请求Http接口OkHttp超详细讲解的相关资料,OkHttp是一款优秀的HTTP客户端框架,文中通过代码示例介绍的非常详细,需要的朋友可以参考下2024-02-02Mybatis-Plus读写Mysql的Json字段的操作代码
这篇文章主要介绍了Mybatis-Plus读写Mysql的Json字段的操作代码,文中通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-04-04Spring Boot中数据库操作Druid和HikariDataSource的详细过程
这篇文章主要介绍了Spring Boot中数据库操作Druid和HikariDataSource的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-06-06
最新评论