β

Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析

程序猿DD | 博客 853 阅读

在Spring Boot 2.0中推出了Relaxed Binding 2.0,对原有的属性绑定功能做了非常多的改进以帮助我们更容易的在Spring应用中加载和读取配置信息。下面本文就来说说Spring Boot 2.0中对配置的改进。

配置文件绑定

简单类型

在Spring Boot 2.0中对配置属性加载的时候会除了像1.x版本时候那样 移除特殊字符 外,还会将配置均以 全小写 的方式进行匹配和加载。所以,下面的4种配置方式都是等价的:

spring:
jpa:
databaseplatform: mysql
database-platform: mysql
databasePlatform: mysql
database_platform: mysql

Tips:推荐使用全小写配合 - 分隔符的方式来配置,比如: spring.jpa.database-platform=mysql

List类型

在properties文件中使用 [] 来定位列表类型,比如:

spring.my-example.url=http://example.com,http://spring.io

而在yaml文件中使用可以使用如下配置:

spring:
my-example:
url: http://example.com, http://spring.io

注意:在Spring Boot 2.0中对于List类型的配置必须是连续的,不然会抛出 UnboundConfigurationPropertiesException 异常,所以如下配置是不允许的:

spring.my-example.foo=bar
spring.my-example.hello=world
spring:
my-example:
'[foo.baz]': bar

环境属性绑定

简单类型

在环境变量中通过小写转换与 . 替换 _ 来映射配置文件中的内容,比如:环境变量 SPRING_JPA_DATABASEPLATFORM=mysql 的配置会产生与在配置文件中设置 spring.jpa.databaseplatform=mysql 一样的效果。

List类型

由于环境变量中无法使用 [ ] 符号,所以使用 _ 来替代。任何由下划线包围的数字都会被认为是 [] 的数组形式。比如:

MY_FOO_1 = my.foo[1]
MY_FOO_1_2 = my.foo[1][2]

系统属性绑定

简单类型

系统属性与文件配置中的类似,都以移除特殊字符并转化小写后实现绑定,比如下面的命令行参数都会实现配置 spring.jpa.databaseplatform=mysql 的效果:

-D"spring.my-example.url[0]=http://example.com"
-D"spring.my-example.url[1]=http://spring.io"

同样的,他也支持逗号分割的方式,比如:

this.environment.containsProperty("spring.jpa.database-platform")

而下面的方式是无法获取到 spring.jpa.database-platform 配置内容的:

@Data
@ConfigurationProperties(prefix = "com.didispace")
public class FooProperties {

private String foo;

}

接下来,通过最新的 Binder 就可以这样来拿配置信息了:

com.didispace.post[0]=Why Spring Boot
com.didispace.post[1]=Why Spring Cloud

com.didispace.posts[0].title=Why Spring Boot
com.didispace.posts[0].content=It is perfect!
com.didispace.posts[1].title=Why Spring Cloud
com.didispace.posts[1].content=It is perfect too!

要获取这些配置依然很简单,可以这样实现:

ApplicationContext context = SpringApplication.run(Application.class, args);

Binder binder = Binder.get(context.getEnvironment());

// 绑定List配置
List<String> post = binder.bind("com.didispace.post", Bindable.listOf(String.class)).get();
System.out.println(post);

List<PostInfo> posts = binder.bind("com.didispace.posts", Bindable.listOf(PostInfo.class)).get();
System.out.println(posts);

代码示例

本文的相关例子可以查看下面仓库中的 Chapter2-2-1 目录:

Spring Booot 2.0 新特性详解正在连载, 点击看看都有哪些解读

在Spring Boot 2.0中推出了Relaxed Binding 2.0,对原有的属性绑定功能做了非常多的改进以帮助我们更容易的在Spring应用中加载和读取配置信息。下面本文就来说说Spring Boot 2.0中对配置的改进。

作者:程序猿DD | 博客
Dream big, work smart, deliver fast

发表评论