抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

SpringBoot自定义starter

学习背景

  最近和同事在开发一个叫做数据准备的项目,用到了SpringBoot(ps:之前的项目用的是ssm,第一次正式使用SpringBoot),现在对于这种开箱即用的SpringBoot-Starter感到无比的惊叹,需要使用某个中间件,只需引入然后附加少许配置即可投入生产。今天就开始学习一下SpringBoot的starter的开发规范。

Starter的构成

1、命名

创建一个工程叫做Flyway-spring-boot-starter

Spring 官方对 starter 的命名是有规范的,只有官方提供的 starter, 才能命名为 spring-boot-starter-{name}, 比如 spring-boot-starter-web; 而对于非官方的,需以 {name}-spring-boot-starter 的格式命名。

2、增加Spring-Boot-AutoConfiguration依赖

1
2
3
4
5
6
<!-- 自动化配置依赖,自定义 starter 核心依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

3、新增自动配置类

  创建类 FlyWayAutoConfiguration 来实现自动配置化功能

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
package com.yidan.flyway;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* @author wuxuan.chai
* @date 2020/10/19 5:57 下午
*/
@Configuration
@ConditionalOnClass(SelfService.class)
@EnableConfigurationProperties(SelfProperties.class)
public class FlyWayAutoConfiguration {

@Bean
@ConditionalOnMissingBean
public SelfService selfService() {
return new SelfService();
}

}

接下来,对上面相关注解说明一下:
@Configuration: 标注类为一个配置类,让 spring 去扫描它;
@ConditionalOnClass:条件注解,只有在 classpath 路径下存在指定 class 文件时,才会实例化 Bean;
@EnableConfigurationProperties:使指定配置类生效;
@Bean: 创建一个实例类注入到 Spring Ioc 容器中;
@ConditionalOnMissingBean:条件注解,意思是,仅当 Ioc 容器不存在指定类型的 Bean 时,才会创建 Bean。

4、自定义配置类及功能实现

创建自定义配置类 SelfProperties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.yidan.flyway;

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
* @author wuxuan.chai
* @date 2020/10/19 6:01 下午
*/
@ConfigurationProperties(prefix = "flyway.self")
public class SelfProperties {
private String message = "hello flyway";

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}
}

创建SelfService业务方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.yidan.flyway;

import javax.annotation.Resource;

/**
* @author wuxuan.chai
* @date 2020/10/19 6:04 下午
*/
public class SelfService {
@Resource
private SelfProperties selfProperties;

public String message() {
return selfProperties.getMessage();
}
}

5、创建spring.factories文件

  在resource目录下创建META-INF目录,在该目录下创建spring.factories文件。
Spring Boot 会在启动时,自动会去查找指定文件 /META-INF/spring.factories,若有,就会根据配置的类的全路径去自动化配置。

1
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.yidan.flyway.FlywayAutoConfiguration

6、自定义的配置信息元数据描述

我们在开发SpringBoot的项目时,在写application.properties(或application.yml)时,IDEA会自动智能提醒,key和value的值。它是如何做到的呢?在Spring的官方文档中有相对应的介绍SpringBoot自定义配置详解

在Resourse目录下的META-INF 创建:spring-configuration-metadata.json

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
{
"groups": [
{
"sourceType": "com.yidan.flyway.SelfProperties",
"type": "com.yidan.flyway.SelfProperties",
"name": "flyway.self"
}
],
"hints": [
{
"name": "flyway.self.message",
"values": [
{
"value":"hello flyway",
"description": "第一个值"
},
{
"value": "hello configuration",
"description": "第二个值"
}
],
"providers": [
{
"name": "flyway starter",
"parameters": "123"
}
]
}
],
"properties": [
{
"name": "flyway.self.message",
"type": "java.lang.String",
"description": "自定义的配置",
"sourceType": "com.yidan.flyway.SelfProperties",
"defaultValue": "hello flyway",
"deprecation": {
"level": "warning",
"reason": "测试忽略理由",
"replacement": "hello configuration"
}
}
]
}

项目使用

引入依赖:

1
2
3
4
5
<dependency>
<groupId>com.yidan</groupId>
<artifactId>flyway-spring-boot-starter</artifactId>
<version>${project.version}</version>
</dependency>

使用我们自动装配的bean: SelfService, 修改配置文件中:flyway.self.message=hello configuration (此时IDEA会自动提示我们自定义的key,甚至有值的推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.yidan.passport;

import com.yidan.flyway.SelfService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
* @author wuxuan.chai
* @date 2020/10/19 6:08 下午
*/
@RestController
public class TestController {
@Resource
private SelfService selfService;

@GetMapping("/get")
public String message() {
return selfService.message();
}
}

测试:

1
2
$ curl http://localhost:6002/get
hello configuration

完,后续遇到再做补充!!!

评论