SpringBoot3.x中spring.factories功能被移除的解决方案 - throwable
source link: https://www.cnblogs.com/throwable/p/16950353.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
背景#
笔者所在项目组在搭建一个全新项目的时候选用了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
后再进行版本升级。
(c-1-d e-a-20221204 广州基本开放,不需要做核酸了)
Recommend
-
40
-
3
前提# Spring团队致力于为Spring应用程序提供原生映像支持已经有一段时间了。在SpringBoo2.x的
-
2
从 2018 年 2 月 28 号发布 Spring Boot 2.0 版本开始,整个 2.X 版本已经经过了 4 年多的时间,累计发布了 95 个不同的版本,而就在前不久,2.X 系列的也已经迎来了他的最终版本:2.7。 前几天我还写了一篇关于 Spring Boot 从 2.1 版本升级到 2.7 的文章,...
-
1
11月24号,Spring Boot 3.0 发布了第一个正式的 GA 版本,一起看看新版本到底有哪些变化。 2.7版本升级指南
-
0
Springboot3整合使用ja-captcha行为验证码解决方案 截止...
-
2
标签:切面.调度.邮件.监控; 在上篇《SpringBoot3基础》中已经完成入门案例的开发和测试,在这篇内容中再来看看进阶功能的用法; 主要涉及如下几个功能点: 调度任务:在应用中提供一定的轻量级...
-
2
SpringBoot3.1.1 整合 Elasticsearch8.7.1 2023/07/18 Java Elasticsearch SpringBoot 示例代码: 官方教程:
-
3
标签:ShardingSphere5.分库.分表; 分库分表的设计和实现方式,在之前的内容中总结过很多,本文基于SpringBoot3和ShardingSphere5框架实现数据分库分表的能力; 不得不提ShardingSphere...
-
7
SpringBoot3集成RocketMq 精选 原创 标签:RocketMq5.Dashboard;...
-
3
Java21 + SpringBoot3使用Spring Security时如何在子线程中获取到认证信息 ...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK