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

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

时间:2022-12-19 11:07:34浏览次数:74  
标签: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​​后再进行版本升级。

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

相关文章

  • Spring Boot 之 RESRful API 权限控制
    一、为何用RESTfulAPI1.1RESTful是什么?RESTful(RepresentationalStateTransfer)架构风格,是一个Web自身的架构风格,底层主要基于HTTP协议(ps:提出者就是HTTP协议的作者),是分布......
  • Spring的两种任务调度Scheduled和Async
    Spring提供了两种后台任务的方法,分别是:调度任务,@Schedule异步任务,@Async当然,使用这两个是有条件的,需要在spring应用的上下文中声明​​​<task:annotation-driven/>​​​......
  • springboot项目打包报错:Type org.springframework.boot.maven.RepackageMojo not pres
    折磨了好久的一个问题,换过spring-boot-maven-plugin版本,但不见效。今天参考这篇文章:springboot打包RepackageMojonotpresent,版本改成2.6.2,不行。就想,可能是我用的idea......
  • SpringData ES中一些底层原理的分析
    之前写过一篇​​SpringDataES关于字段名和索引中的列名字不一致导致的查询问题​​​,顺便深入学习下SpringDataElasticsearch。 ​​​SpringDataElasticsearch​​......
  • Spring AMQP项目
    SpringAMQP项目将Spring的核心概念应用于基于AMQP的消息传递解决方案的开发。我们提供了一个“模板”作为发送和接收消息的高级抽象。我们还为消息驱动的POJO提供支持......
  • Spring AMQP项目(二)
    4.1.5.发送消息发送消息时,您可以使用以下任一方法:voidsend(Messagemessage)throwsAmqpException;voidsend(StringroutingKey,Messagemessage)throwsAmqpExceptio......
  • Spring Cloud实践:降级、限流、滚动、灰度、AB、金丝雀的实现思路
    端口:8888,方便起见直接读取配置文件,生产环境可以读取git。application-dev.properties为全局配置。先启动配置中心,所有服务的配置(包括注册中心的地址)均从配置中心读取。consu......
  • SpringBoot知识点
    自动装配原理SpringBoot特点优点:(1)创建独立Spring应用(2)内嵌web服务器(3)自动start依赖,简化构建配置(4)自动配置Spring以及第三方功能(5)提供生产级别的监控、健康检测以及......
  • 【深入浅出Spring原理及实战】「源码原理实战」从底层角度去分析研究PropertySourcesP
    Spring提供配置解析功能主要有一下xml文件占位符解析和Java的属性@Value的占位符解析配置这两种场景进行分析和实现解析,如下面两种案例。xml文件的占位符解析配置<bean......
  • spring的学习
    构造器的注入  这是原始的方法的注入  构造器注入  可以通过两种方法来进行注入 ......