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 @ 2020-03-06 10:51  SunSAS  阅读(465)  评论(0编辑  收藏  举报