问题描述
使用自定义starter,在测试时报错:
“Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean ...... ”
无法正确加载自动配置类
问题解决
原因是由于使用的SpringBoot
版本为3.0,导致原 “在 src/main/resources/META-INF
目录下创建 spring.factories
文件中声明的加载类的方式” 失效。
tip:spring.factories功能在SpringBoot2.7
已经废弃,并且在SpringBoot3.0
移除。
代替方法:
在Spring Boot 3.0及更高版本中,spring.factories
文件被替换为了使用
META-INF/spring/
org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件来进行自动配置类的声明。
然后将需要自动加载的配置类的引用写在里面即可。
自定义SpringBoot Starter步骤
以Maven项目为例
1.创建Spring Boot项目
<groupId>com.example</groupId>
<artifactId>starter-demo</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<name>starter-demo</name>
<description>custom starter</description>
<properties>
<java.version>17</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.1</version>
</parent>
tip:将SpringBoot的启动类删除
2.添加必要的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 其他依赖 -->
tip:将项目自动创建<build></build>标签删除
3.创建自动配置类
在项目中新建一个类作为自动配置类
import com.example.starter_demo.service.StarterService;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties("my.starter") //使用这个注解可以在调用starter项目的配置文件中使用
@ComponentScan(value = "com.example.starter_demo") //包扫描路径
public class MyStarterConfig {
private String Value; // 可以读到这个配置 my.starter.Value
//服务类
@Bean
public StarterService starterService(){
return new StarterService(Value);
}
}
4.创建服务类
@Service
public class StarterService {
private String value;
public StarterService() {
}
public StarterService(String value) {
this.value = value;
}
public String getValue(){
return Value;
}
}
5. 配置META-INF文件
SpringBoot版本为 3.x 时:
在 src/main/resources/META-INF
目录下创建 org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件
并将需要自动加载的配置类的引用写在里面
com.example.starter_demo.MyStarterConfig
SpringBoot版本为 2.x 时:
在 src/main/resources/META-INF
目录下创建 spring.factories
文件,内容如下
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.starter_demo.MyStarterConfig
6.打包和发布
使用Maven install 打包Starter,并将其发布到Maven仓库,供其他项目使用。(打包后默认在本地Maven仓库中)
7.使用自定义Starter
在项目中添加自定义starter的依赖(如何查找:在第一步创建SpringBoot项目中查看配置)
<dependency>
<groupId>com.example</groupId>
<artifactId>starter-demo</artifactId>
<version>0.0.1</version>
</dependency>
本文供学习使用,如有错误,欢迎指出。