SpringBoot3.x自定义starter自动配置类没有被正确加载报错“No qualifying bean”,解决方法 (附带自定义Starter步骤)

问题描述

使用自定义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>

本文供学习使用,如有错误,欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值