关于SpringBoot3.x中spring.factories功能被移除的解决方案
作者:Throwable 发布时间:2022-03-25 03:04:33
背景
笔者所在项目组在搭建一个全新项目的时候选用了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
后再进行版本升级。
来源:https://www.cnblogs.com/throwable/p/16950353.html


猜你喜欢
- 如何打印GC日志排查问题在工作当中,有时候我们会需要打印GC的相关信息来定位问题。该如何做呢?先来看个示例public static voi
- 一、简介什么是线程池?池的概念大家也许都有所听闻,池就是相当于一个容器,里面有许许多多的东西你可以即拿即用。java中有线程池、连接池等等。
- 简介自从JDK中引入了stream之后,仿佛一切都变得很简单,根据stream提供的各种方法,如map,peek,flatmap等等,让我们
- 1. 传统方式:在内存中读取文件内容读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速
- 本文实例为大家分享了android实现简单活动转盘的具体代码,供大家参考,具体内容如下页面public class CircleTurnta
- 带返回值的方法练习需求: 设计一个方法可以获取两个数的较大值,数据来自于参数思路:1. 定义一个方法,用于获取两个数中的较大数public
- 链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表、循环链表、双向链表,下面将逐一介绍。链表在数据结构中是基础
- 本文实例讲述了Android开发之SeekBar基本使用及各种美观样式。分享给大家供大家参考,具体如下:改变控件透明度只需通过 .setAl
- 一.代码实现1. “Activity_11\src\yan\activity_11\MainActivity.java”pack
- 我这里主要是对串口类的简单使用,实现的功能是以读写方式打开串口,点击发送数据按钮将发送区的数据发送到缓冲区,然后在接收区显示出来,界面如下:
- 一、HTTP http请求 一般一个http请求包括以下三个部分: 1 请求方法,如get,pos
- 在使用spring框架中我们都知道,某个类如果使用了@Service、@Autowire 这种依赖注入的方式引用了其他对象,在另外一个类中,
- 本文实例为大家分享了Android实现长截屏功能的具体代码,供大家参考,具体内容如下1、MainActivitypublic class M
- 具体安装步骤,不再赘述,仅附上个人工作、学习中的对 EasyCode 的详细配置。插件链接地址:https://gitee.com/make
- 一、写在前面的在需求上遇到背景设置透明度还是比较常见的,设置透明度有几种方式,但是不同的场景应用下,不同的方式可能会出现一些问题。针对开发过
- 最近在研究springboot实现FastJson解析json数据的方法,那么今天也算个学习笔记吧!添加jar包:<dependenc
- 基本概念Spring Validation 验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范
- 1.mybatis对多语句类型的支持在mybatis映射文件中传参数,主要用到#{} 或者 ${}.#{}:表示使用这种符号的变量会以预编译
- 今天来了一个问题:软键盘无法弹出。分析后是因为系统判断当前有外接硬键盘,就会隐藏软键盘。但实际情况并不是这么简单,该问题只有在特定条件下偶现
- 一、常见游戏规则从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要