首页 > 其他分享 >SpringBoot3.x中spring.factories功能被移除的解决方案

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

时间:2022-12-10 16:01:49浏览次数:71  
标签:spring boot springframework autoconfigure SpringBoot3 Boot 移除 org

背景

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

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

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

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

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

SpringBoot3.x中spring.factories功能被移除的解决方案_接口实现_03

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



标签:spring,boot,springframework,autoconfigure,SpringBoot3,Boot,移除,org
From: https://blog.51cto.com/throwable/5927729

相关文章

  • spring——Spring Bean属性注入——构造函数注入
    所谓Bean属性注入,简单点说就是将属性注入到Bean中的过程,而这属性既可以普通属性,也可以是一个对象(Bean)。Spring主要通过以下2种方式实现属性注入:构造函数注入sett......
  • spring——控制反转(IoC)—— 与 ——依赖注入(DI)
    控制反转(IoC)  在传统的Java应用中,一个类想要调用另一个类中的属性或方法,通常会先在其代码中通过newObject()的方式将后者的对象创建出来,然后才能实现属性或方法......
  • spring——Spring Bean定义
          在XML配置的<beans>元素中可以包含多个属性或子元素,常用的属性或子元素如下表所示。属性名称描述idBean的唯一标识符,SpringIoC容器对Bean......
  • SpringBoot内置tomcat启动过程及原理
    作者:李岩科1背景SpringBoot是一个框架,一种全新的编程规范,他的产生简化了框架的使用,同时也提供了很多便捷的功能,比如内置tomcat就是其中一项,他让我们省去了搭建tomca......
  • spring——第一个spring案例
    Spring是什么(理解) Spring是分层的JavaSE/EE应用full-stack轻量级开源框架,以IoC(InverseOfControl:反转控制)和AOP(AspectOrientedProgramming:面向切面编程)为内核......
  • springcloud Config 分布式配置中心
     Server端:提供配置⽂件的存储、以接⼝的形式将配置⽂件的内容提供出去,通过使⽤@EnableConfigServer注解在Springboot应⽤中⾮常简单的嵌⼊Client端:通过接⼝获取配置数据......
  • springcloud Stream消息驱动
    SpringCloudStream是⼀个构建消息驱动微服务的框架。应⽤程序通过inputs(相当于消息消费者consumer)或者outputs(相当于消息⽣产者producer)来与SpringCloudStream中的bind......
  • springcloud Sleuth 链路追踪
    1.分布式链路追踪技术核⼼思想下图描述了⼀个常⻅的调⽤场景,⼀个请求通过⽹关服务路由到下游的微服务-1,然后微服务-1调⽤微服务-2,拿到结果后再调⽤微服务-3,最后组合微服务-......
  • springcloud GateWay网关
    GateWay如何工作客户端向SpringCloudGateWay发出请求,然后在GateWayHandlerMapping中找到与请求相匹配的路由,将其发送到GateWayWebHandler;Handler再通过指定的过滤器链......
  • SpringBoot向Excel模板中写入数据并下载 (无需获取file对象及模板绝对路径)
    之前用获取模板路径的方式测试没问题打包后就有问题了莫名出现一个!找了很多教程尝试无果最终使用下面这个方式无需获取file对象以及模板路径的方式进行写入下载(那个......