0%

spring-boot-starter 版本导致自动配置失效问题

在写我的 IrisRPC 框架的时候,希望能够以 spring-boot-starter 的形式适配一下 SpringBoot 框架,参照网上的步骤进行了 starter 的开发,开发完成后测试的时候发现 AutoConfiguration 中的 Bean 并没有成功注入,反复检查之后也没发现问题。
最终在这篇文章中 springboot自定义starter,实现自动装配_定制starter的功能-CSDN博客找到了问题出现的原因,是因为 Spring 版本导致的配置方式不一致带来的问题:

自动配置类放入自动配置文件中,不同版本对应的配置文件不同,按需选择。

  1. springboot 2.7 之前自动配置文件为 spring.factories ,配置内容的形式如下:
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=
    x.x.xxxAutoConfiguration
  2. springboot 3.0 之后自动配置文件只能使用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports, 在该文件中写好类路径
  3. springboot 2.7springboot 3.0,自动配置文件可以使用 spring.factories,也可以使用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

这里也总结一下 spring-boot-starter 的开发流程:

创建项目

创建一个 Maven 项目,可以参考命名为:xxx-spring-boot-starter ,引入相关 Maven 依赖:

<dependency>  
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${springboot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${springboot.version}</version>
</dependency>
<!-- 这个依赖用来提供配置项提示补全 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${springboot.version}</version>
</dependency>

配置属性(可选)

用来实现从 spring 项目配置文件中自动加载配置,如果功能不需要配置项,这一步可以省略。

@ConfigurationProperties(prefix = "mystarter")
public class MyProperties {
private String name;
// Getters and Setters
}

开发自动配置类

@Configuration
@EnableConfigurationProperties(MyProperties.class)//使MyProperties注解的类生效
//还可以结合一些其他的条件注解来动态设置是否需要注入
public class MyAutoConfiguration {

@Bean
@ConditionalOnMissingBean // 不存在才注入
public MyBean cacheManager(MyProperties properties) {
// 创建并配置CacheManager
return new MyBean(properties);
}
}

设置允许自动配置

需要允许用户的 spring 项目引入 starter 后 MyAutoConfiguration 能够生效,因此需要在 starter 项目中做出配置,这个也就是前面提到的不同的 spring 版本(是以用户使用的版本为准)有不同的配置方案:

  1. springboot 2.7 之前自动配置文件为 spring.factories ,配置内容的形式如下:
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=x.x.xxxAutoConfiguration
  2. springboot 3.0 之后自动配置文件只能使用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports, 在该文件中写好类路径
  3. springboot 2.7springboot 3.0,自动配置文件可以使用 spring.factories,也可以使用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

由于我们没办法确定用户使用的是哪个版本,所以我觉得最好的方法是==都配置==。

测试及使用

在 maven 中引入我们前面开发的 starter,如果设置了 MyProperties 的话,进行一下配置就可以了。

参考资料