SpringBoot中如何创建一个自定义的starter

在springboot中,我们经常可以看到一些如xxx-starter-xxx的maven坐标,典型是spring-boot-starter-web。SpringBoot可以实现将常用的场景抽取成了一个个starter(场景启动器),使用者通过引入springboot提供的这些启动器,搭配少量的配置就能实现相应的功能。

在公司的内部往往会有一些封装的中间件,这些封装的中间件需要被其他项目依赖,其他的项目直接引入starter便可以实现自动化配置。下面我们来聊聊如何自定义一个starter。

1、自定义starter

需求描述:通过自定义的starter,实现每个项目中配置不同的参数值,并且读取这个配置的值。

项目的工程的结构如下所示:

(1)在自定义starter模块中添加必要依赖

<dependencies> 
    <dependency> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-autoconfigure</artifactId> 
    </dependency> 
    <dependency> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-autoconfigure-processor</artifactId> 
    </dependency> 
    <dependency> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
</dependencies>

(2)自定义读取配置的配置类

@Component 
@ConfigurationProperties("com.longxia") 
@Data 
public class MytConfigProperty { 
    private String name; 
    private Integer age; 
}

(3)定义service

public class MyService { 
    private MyConfigProperty myConfigProperty; 
    public MyFirstService() { 
    } 
    public MyService(MytConfigProperty myConfigProperty) { 
        this.myConfigProperty = myConfigProperty; 
    } 
    public String say(){ 
        return "myStarter " + myConfigProperty.getName() + " !"; 
    } 
}

(4)添加service的配置

@Configuration 
//开启配置文件的数据注入 
@EnableConfigurationProperties({MytConfigProperty.class}) 
public class MyConfig { 
    @Resource 
    private MyConfigProperty myConfigProperty; 
    @Bean 
    public MyFirstService getMyFirstService(){ 
        return new MyFirstService(myFirstConfigProperty); 
    } 
}

(5)编写spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration= 
com.longxia.spring.starter.config.MyConfig

spring.factories的目的是让我们配置的starter可以被其他项目的在启动的时候扫描到。

2、使用自定义的starter

(1)添加自定义的starter的依赖

<dependency> 
    <groupId>com.longxia.cloud</groupId> 
    <artifactId>common-starter</artifactId> 
    <version>1.0-SNAPSHOT</version> 
</dependency>

(2)在使用者中添加配置文件属性值

(3)定义controller,测试效果

@RestController 
@RequestMapping("/starter") 
public class MyFirstStarterController { 
    @Resource 
    private MytService myService; 
    @GetMapping("/first") 
    public String first() { 
        return mytService.hello(); 
    } 
}

在浏览器上输入:http://localhost:8080/starter/first

到此自定义的starter的就完成了,如果哪个业务模块中需要使用封装的common-starter,直接引入其maven依赖并且做相应的配置就可以使用了。

5