gpt4 book ai didi

SpringBoot3.x中spring.factories功能被移除的解决方案

转载 作者:我是一只小鸟 更新时间:2022-12-04 22:49:21 32 4
gpt4 key购买 nike

背景

笔者所在项目组在搭建一个全新项目的时候选用了 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 中编写的组件都是使用这种方案.

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

sp-3-upgrade-2.png

替代方案比较简单,就是在类路径下创建 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 等:

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 广州基本开放,不需要做核酸了) 。

最后此篇关于SpringBoot3.x中spring.factories功能被移除的解决方案的文章就讲到这里了,如果你想了解更多关于SpringBoot3.x中spring.factories功能被移除的解决方案的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com