SpringBoot的自定义starter开发

SpringBoot的自定义starter开发

SpringBoot官方默认提供了很多的starter。参考官方的reference。starter作为在SpringBoot中重要的特性,使用时能够在POM文件中直接引用这些starter,可以一站式的获取与Spring结合的相关服务和功能。如果想引入redis等功能。则直接添加使用spring-boot-starter-data-redis。只需在配置文件中配置少量属性,就可以在应用中使用。

SpringBoot的自动配置原理

SpringBoot通过starter,引用相关服务,然后通过autoConfigure来自动配置相关服务。更多具体的实现可以参考这篇文章,在这篇文章中,简要的分析来如何实现自定义starter和基本的自动配置实现。

starter的基本结构

  • 包名称以 spring-boot-starter-xxx 命名,如引用spring-boot-starter-data-jpa.其中的内容只包括pom文件,用来引用相关服务的jar包。
  • 包名称以xxx-spring-boot-autoconfigure命名。包含:
    • xxxAutoConfiguration 自动配置类,使用Configuration注解标志为配置类。使用Conditionalxxxx相关注解表示条件,使用EnableConfigurationProperties注解,来指定配置属性类。
    • xxxProperties 配置属性类。使用ConfigurationProperties注解来标志为配置属性类,并且需要指定prefix,以便在配置文件中,使用prefix+属性名来设置相关属性。
    • spring.factories 文件中添加相关信息,用来指定需要进行自动配置的类的全限定名称。如:
1
2
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,

开始自定义starter

在正式进行之前,需要先创建一个空的Project,用来放spring-boot-starter-xxxxxx-spring-boot-autoconfigure

创建spring-boot-starter-xxx和xxx-spring-boot-autoconfigure

在创建完空项目后,会要求创建module。选择maven或者Spring Initializer进行spring-boot-starter-xxx的创建。

配置starter

在实际操作配置starter之前,先来分析SpringBoot官方提供的starter的基本的依赖结构,为接下来的构建起到模版的作用。

在左边的为spring-boot-starter-web的的简单的依赖关系,它依赖spring-boot-starter。而spring-boot-starter进一步依赖于spring-boot-autoconfigure用来进行自动配置。

配置autoconfiguration包

pom配置

在pom.xml中添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>2.1.6.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

主要需要依赖spring-boot。如果在自动配置类需要进行其他特殊的Conditional设置时,还需要引入spring-boot-autoconfigure

添加xxxAutoConfiuration和xxxProperties类

这两个类是自动配置中必须的类。内容可以参考WebMvcAutoConfigurationWebMvcProperties这两个类。下面是我的具体实现类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// HelloAutoConfiguration 自定义的AutoConfiguration类
@Configuration
@EnableConfigurationProperties({HelloProperties.class})
public class HelloAutoConfiguration {

private final HelloProperties helloProperties;

public HelloAutoConfiguration(HelloProperties helloProperties) {
this.helloProperties = helloProperties;
}

@Bean
public HelloService sayHello(){
HelloService helloService = new HelloService();
// 设置配置属性
helloService.setHelloProperties(helloProperties);
return helloService;
}

}

//使用service类来测试是否配置成功,方法调用
public class HelloService {

HelloProperties helloProperties;

public HelloProperties getHelloProperties() {
return helloProperties;
}

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

// 方法调用验证属性是否其作用。也就是自动配置是否生效
public String sayHello(){
return helloProperties.getPrefix() + " hello world !";
}
}

// 自定义的Properties类
@ConfigurationProperties(prefix = "spring.hello")
public class HelloProperties {
private String prefix ;

public String getPrefix() {
return prefix;
}

public void setPrefix(String prefix) {
this.prefix = prefix;
}
}

spring.factories

如果想要使用自动配置,必须添加spring.factories这个文件。添加如下内容:

1
2
3
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.nanyin.hello.HelloAutoConfiguration

配置 starter-xxx 包

pom配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependencies>
<!--构建的starter依赖>spring-boot-starter 和其他需要的starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<!--依赖自动配置包-->
<dependency>
<groupId>com.nanyin</groupId>
<artifactId>hello-spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>

项目结构

需要删除不需要的类或目录,如SpringBoot启动类、Resource目录、test目录。

打成jar包

使用idea中的maven工具,对上个module进行分别打包,安装到本地。打包的顺序是先安装 autoconfiuration ,然后再安装 starter-xxx

使用starter

新建一个web的SpringBoot项目,新建一个Controller,里面添加如下内容:

1
2
3
4
@RequestMapping("/sayHello")
public @ResponseBody String sayHello(){
return helloService.sayHello();
}

并在配置文件中添加:

1
2
3
spring:
hello:
prefix: PREFIX

在pom.xml中添加自定义的starter:

1
2
3
4
5
6
<!-- 添加自定义starter -->
<dependency>
<groupId>com.nanyin</groupId>
<artifactId>spring-boot-starter-hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

运行程序,在地址栏上输入http://localhost:8081/sayHello

-------------本文结束感谢您的阅读-------------

本文标题:SpringBoot的自定义starter开发

文章作者:NanYin

发布时间:2019年08月13日 - 12:08

最后更新:2020年06月26日 - 16:06

原始链接:https://nanyiniu.github.io/2019/08/13/SpringBoot%E8%87%AA%E5%AE%9A%E4%B9%89starter/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。