布景

笔者地点项目组在搭建一个全新项目的时分选用了SpringBoot3.x,项目中应用了许多SpringBoot2.x年代相关的第三方组件例如baomidou出品的mybatis-plusdynamic-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,\...接口完成类(或许运用了该注解的类)全类名-nspring.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功能被移除的解决方案

替代计划比较简单,就是在类途径下创建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,文件的内容是:每个完成类的全类名独自一行。例如关于运用了(低版别还没适配Spring Boot 3.0mybatis-plusdynamic-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-springdubbo等:

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

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