Spring Boot 提供了一种非常简洁的方法来加载应用程序的属性。考虑使用 YAML 格式描述的一组属性:
prefix:
stringProp1: propValue1
stringProp2: propValue2
intProp1: 10
listProp:
- listValue1
- listValue2
mapProp:
key1: mapValue1
key2: mapValue2
这些条目也可以通过以下方式在传统的 application.properties 文件中进行描述:
prefix:
stringProp1: propValue1
stringProp2: propValue2
intProp1: 10
listProp:
- listValue1
- listValue2
mapProp:
key1: mapValue1
key2: mapValue2
我花了一些时间,但我确实喜欢以 YAML 格式描述的属性的分层外观。
所以现在,给定这个属性文件,传统的 Spring 应用程序将按以下方式加载属性:
prefix:
stringProp1: propValue1
stringProp2: propValue2
intProp1: 10
listProp:
- listValue1
- listValue2
mapProp:
key1: mapValue1
key2: mapValue2
请注意“prefix.stringProp”键的占位符。
然而,这对于加载一系列相关属性来说并不理想,例如在这种特定情况下由方便命名为“prefix”的前缀命名空间。
Spring boot 采用的方法是定义一个可以以这种方式保存所有相关属性系列的 bean:
prefix:
stringProp1: propValue1
stringProp2: propValue2
intProp1: 10
listProp:
- listValue1
- listValue2
mapProp:
key1: mapValue1
key2: mapValue2
在运行时,所有字段都将干净利落地绑定到相关属性。
另外请注意“intProp1”字段顶部的
JSR-303
注释,该注释验证该字段的值是否介于 0 和 99 之间。@ConfigurationProperties 将调用验证器以确保绑定的 bean 得到验证。
此处显示了使用此功能的集成测试:
prefix:
stringProp1: propValue1
stringProp2: propValue2
intProp1: 10
listProp:
- listValue1
- listValue2
mapProp:
key1: mapValue1
key2: mapValue2
如果您有兴趣进一步探索此示例,我有一个 github 存储库,其中包含已在 此处 签入的代码。