Spring Boot2.0的属性绑定
原文
从Spring boot第一个版本以来,我们可以使用@ConfigurationProperties注解将属性绑定到对象。也可以指定属性的各种不同格式。比如,person.first-name,person.firstName和PERSON_FIRSTNAME都可以使用。这个功能叫做“relaxed binding”。
不幸的是,在spring boot 1.x,“relaxed binding”显得太随意了。从而使得很难来定义准确的绑定规则和指定使用的格式。在1.x的实现中,也很难对其进行修正。比如,在spring boot 1.x中,不能将属性绑定到java.util.Set对象。
所以,在spring boot 2.0中,开始重构属性绑定的功能。我们添加了一些新的抽象类和一些全新的绑定API。在本篇文章中,我们会介绍其中一些新的类和接口,并介绍添加他们的原因,以及如何在自己的代码中如何使用他们。
Property Sources
如果你已经使用spring有一段时间,你应该对Environment比较熟悉了。这个接口继承了PropertyResolver,让你从一些PropertySource的实现解析属性。
Spring Framework提供了一些常用的PropertySource,如系统属性,命令行属性,属性文件等。Spring Boot自动配置这些实现(比如加载application.properties)。
Configuration Property Sources
比起直接使用已存在的PropertySource实现类,Spring Boot2.0引入了新的ConfigurationPropertySource接口。我们引入这个新的接口来定义“relaxed binding”规则。
该接口的主要API显得非常简单
ConfigurationProperty getConfigurationProperty(ConfigurationPropertyName name);
另外有个IterableConfigurationPropertySource变量实现了Iterable<ConfigurationPropertyNaame>,让你可以发现source包含的所有属性名称。
你可以向下面这样将Environment传给ConfigurationPropertySources:
Iterable<ConfigurationPropertySource> sources = ConfigurationPropertySources.get(environment);
我们同时提供了MapConfigurationPropertySource来帮你应付上面的场景。
Configuration Property Names
如果规则明确,实现"relaxed binding"会简单很多。一直使用一致的格式,而不需要去关系在source中的各种无规则的格式。
ConfigurationPropertyNames类来强制进行这些属性命名规则,例如“use lowercase kebab-case names”,在代码中使用person.first-name,在source中使用person.firstName或者PERSON_FIRSTNAME.
Origin Support
如期望的那样,ConfigurationPropertySource返回ConfigurationProperty对象,里面包含了属性的取值,另外有个可选的Origin对象。
spring boot 2.0引入了新的接口Origin,能够指出属性取值的准确位置。其中TextResourceOrigin是较为常用的实现,会提供所加载的Resource,以及对应的行。
对于.properties和.yml文件,我们写了定制的souce加载器,使得追踪成为可能。一些spring boot的功能进行了重写来追踪信息。比如,属性绑定的验证异常现在会显示:
- 最新文章
-
C++ 虚继承实现原理(虚基类表指针与虚基类表)
C++ 类的静态成员
c++成员函数的存储方式
mplab使用小知识
[C/C++基础知识] main函数的参数argc和argv
【C++】智能指针详解
C++中初始化列表的使用(总结)
c、c++中-int型以float或者float型以int输出问题
git提交错误 git config --global user.email “you@example.com“ git config --global user.name “Your Name
Anaconda安装Tensorflow报错UnicodeDecodeError: 'utf-8' codec can't decode ## invalid start byte的问题之解决
- 热门文章
-
VS2015 + Qt5.9.2开发中无法打开源文件“ui_*.h” 和 error MSB6006: “cmd.exe”已退出,代码为 3之解决办法。
VTK Users Guide 中C++例程之rainbow
VTK Users Guide 中C++例程之ImplicitPlaneWidget
VTK Users Guide 中C++例程之multiLineText
VTK Users Guide 中C++例程之annotatePick
VS常见错误:error LNK2019: 无法解析的外部符号
在centos7(EL7.3 即 kernel-3.10.0-514.X )上安装BCM4312无线网卡驱动要注意的问题
centos7 安装时候检测不到空余硬盘的解决办法
CentOS 7 安装出现 /dev/root does not exits 导致无法安装的问题
【吐槽】测试人员如何防开发忽悠