Spring Boot自定义Starter

spring boot为各种场景定义了各种starter,称之为场景启动器,引入starter依赖后,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置,你也可以自己配置一些属性。现在我们自己写一个Starter。

首先看看官方文档对一个starter的要求:

A full Spring Boot starter for a library may contain the following components:
  • The autoconfigure module that contains the auto-configuration code.
  • The starter module that provides a dependency to the autoconfigure module as well as the
    library and any additional dependencies that are typically useful. In a nutshell, adding the
    starter should provide everything needed to start using that library.
大意就是必须包含自动配置模块,必须包括该starter所需的依赖。
 
注意:自定义的spring boot starter有它的命名规范:
xxx-spring-boot-starter
下面项目的之前写的,这里就不改了。

一:准备一个空项目

其下有两个module,一个是starter,starter中只做引入依赖。
一个是它的配置类,starter会依赖此配置类。

空项目会要求新建module

 

首先建立maven项目(starter)

 第二个项目,使用spring Initializr:

不引入模块:

 apply->ok:

 

 二:改造starter和configure

starter的pom.xml引入configure的依赖:

<dependencies>
        <dependency>
            <groupId>com.sunsas</groupId>
            <artifactId>customer-spring-starter-autoconfigurer</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

starter改造完毕。

configure中删除不用的东西:

 pom.xml中删除:

 上面是test模块,我们不需要。下面是打包插件,我们这里只是一个自动配置工具包,不需要。只有你的项目是一个web项目时,含有Main方法的程序入口类,要加该打包插件。

否则会报错误:

repackage failed: Unable to find main class

configure继续添加一个类,这个类将会自动配置到项目中,如果别人引入了我们的starter,就可以使用此类的bean。

复制代码
public class HelloService {

    private HelloProperties helloProperties;

    public HelloProperties getHelloProperties() {
        return helloProperties;
    }

    public void setHelloProperties(HelloProperties helloProperties) {
        this.helloProperties = helloProperties;
    }

    public String hello(String name){
        return helloProperties.getPre() + "--" + name + "--" + helloProperties.getAfter();
    }
}
复制代码

这里的HelloProperties是属性配置。

复制代码
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "sunsas.hello")
public class HelloProperties {
    private String pre;

    private String after;

    public String getPre() {
        return pre;
    }

    public void setPre(String pre) {
        this.pre = pre;
    }

    public String getAfter() {
        return after;
    }

    public void setAfter(String after) {
        this.after = after;
    }
}
复制代码

@ConfigurationProperties:

  告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
   prefix = "xxx":配置文件中哪个下面的所有属性进行一一映射

idea在此类会报错,不用管:

 

 但是HelloProperties在HelloService没有初始化对象,那他是怎么调用的?

那就需要下面的自动配置类了,需要HelloSerive中加上HelloProperties的get set方法。

复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnWebApplication//只有web应用才起效
@EnableConfigurationProperties(HelloProperties.class)//让HelloProperties生效,直接可以Autowired使用
public class HelloServiceAutoConfiguration {

    @Autowired
    private HelloProperties helloProperties;

    @Bean
    public HelloService helloService(){
        HelloService helloService = new HelloService();
        helloService.setHelloProperties(helloProperties);
        return helloService;
    }
}
复制代码

在这个配置类中,我们把HelloProperties给了HelloService,并且通过@Bean像容器中注册了HelloService。

但是我们还得让这个配置类生效,我们仿造spring boot starter的配置类:

 

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.sunsas.HelloServiceAutoConfiguration

至此我们starter就改造完毕。

然后把两个项目安装到仓库中,注意首先安装自动配置类的,因为starter依赖于它:

三:测试

 新建web工程,pom.xml引入我们的starter依赖:

<dependency>
            <groupId>com.sunsas</groupId>
            <artifactId>customer-spring-starter</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

我们的starter和配置类就导入进来了:

 

 写一个contorller:

复制代码
import com.sunsas.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class TestController {
    @Autowired
    private HelloService helloService;

    @GetMapping("/hello")
    public String test(){
        return helloService.hello("sunsas");
    }
}
复制代码

@Autowired可能报错,不用管它。

可以在配置文件中自定义配置我们starter的属性:

 

 

 

启动项目,访问http://localhost:8080/hello:

成功

posted @   SunSAS  阅读(479)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示