构建Spring Boot Starter(二)

构建Spring Boot Starter(二)

注:案例工程使用的spring boot 版本为 2.1.2.RELEASE,Java 版本为 1.8

熟悉spring boot的人肯定对 application.yml 或者 application.properties 配置文件很眼熟(因为个人喜好yaml方式,所以以下示例选用application.yml),因为spring boot 有着约定大于配置的特性,所以当其默认的配置不是我们需要的时候,就可以在工程的resource 目录下找到application.yml 进行相关配置,然后启动程序,这时spring boot便会按照新的配置去运行。

例如 springboot 默认启动端口时8080,如果我们的机器8080端口已被使用,那么就要配置一个未被使用的端口,这是我们只要在application.yml 中填写如下配置:

1
2
server:
port: 18080

然后启动程序……

1
[           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 18080 (http) with context path ''

通过控制台日志我们可以发现,此时spring boot程序的端口已被修改为18080

这种开发方式在spring boot中随处可见,比如如上所示的设置端口,或者如下所示的开启spring-cloud-gateway 通过注册中心自动创建路由,只需要进行如下配置即可:

1
2
3
4
5
6
spring:
cloud:
gateway:
discovery:
locator:
enabled: true

而我们也可以模仿这种开发方式,让我们的程序更加灵活。所以本篇博客将讲述如何在 springboot 2.x 中读取配置文件。

读取application.yml

1. @Value

spring boot 2.x中,如果我们需要读取配置文件,如下面这种形式的配置,

1
2
bfh:
name: BFH

可以通过 @Value 注解来实现,如下:

1
2
3
4
5
6
7
@Value("${bfh.name}")
private String name;

@GetMapping("getValueOfName")
public String getValueOfName() {
return name;
}

获取配置:curl -X GET "http://127.0.0.1:18080/getValueOfName

2. @ConfigurationProperties

@Value 注解虽然好用,但是不支持集合,IDEA 也不能做到智能提示,不管是造轮子,还是平时项目开发都建议使用 @ConfigurationProperties 注解,这样较为规范,接下来将介绍如何使用。

1
2
3
4
5
6
7
8
9
@Data
@Component
@ConfigurationProperties(prefix = "bfh")
public class DemoProperties {

private String name = "bfh";

private Set<String> ips = new LinkedHashSet<>();
}

注:其中属性名要对应配置文件中的属性,比如这里面的name属性,对应配置文件中的bfh.name

如果除去注解不看的话,那么这只是一个普通的简单Java类,首先我们使用 @ConfigurationProperties(prefix = "bfh") 来读取 application.yml 中前缀为 bfh 的配置,使用lombok@Data 来提供必要的 getter setter 方法,最后使用 @Component 将其注入 spring 容器。

我们在 application.yml 添加一些配置数据:

1
2
3
4
5
6
7
8
bfh:
name: BFH
ips:
- 127.0.0.1
- 127.0.0.2
- 127.0.0.3
- 127.0.0.4
- 127.0.0.5

在我们需要读取配置文件的地方注入之前编写好的 DemoProperties 通过相应的get方法就能获取到配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
@Autowired
private DemoProperties properties;

@GetMapping("getStarterIps")
public Set<String> getStarterIps() {
return properties.getIps();
}

@GetMapping("getStarterName")
public String getStarterName() {
return properties.getName();
}

读取自定义yml配置文件

首先我们创建一个 YamlPropertyLoaderFactory ,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12

public class YamlPropertyLoaderFactory extends DefaultPropertySourceFactory {

@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {

if (resource == null) {
super.createPropertySource(name, resource);
}
return new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource()).get(0);
}
}

然后我们准备一个 CommonProperties ,和读取 application.yml不同的是,读取自定义的yml文件,我们需要增加一个注解来指定一下读取的配置文件位置信息,@PropertySource(value = "classpath:common.yml", factory = YamlPropertyLoaderFactory.class) ,代码如下:

1
2
3
4
5
6
7
8
9
10
@Data
@Component
@PropertySource(value = "classpath:common.yml", factory = YamlPropertyLoaderFactory.class)
@ConfigurationProperties(prefix = "common")
public class CommonProperties {

private String name = "common";

private Set<String> list = new LinkedHashSet<>();
}

获取配置信息的方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
@Autowired
private CommonProperties commonProperties;

@GetMapping("getCommonList")
public Set<String> getCommonList() {
return commonProperties.getList();
}

@GetMapping("getCommonName")
public String getCommonName() {
return commonProperties.getName();
}

相关案例代码移步 blog-samples

欢迎 watch star fork toolkit-spring-boot-project ,一个好用的,开箱即用的工具集。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×