与 @ConfigurationProperties 一起使用的自定义基于 XML 的属性源加载器
Posted
技术标签:
【中文标题】与 @ConfigurationProperties 一起使用的自定义基于 XML 的属性源加载器【英文标题】:Custom XML-Based Property Source Loader for Use With @ConfigurationProperties 【发布时间】:2016-07-15 10:29:56 【问题描述】:我有兴趣创建一个或多个自定义属性源加载器,并在我的应用程序中使用带有@ConfigurationProperties
的属性源。
例如,我想开发一个属性源加载器,它能够加载 XML 文件并将其转换为一组属性,这些属性可以注入到我的 @Configuration
注释类中。
@Configuration
@ConfigurationProperties(locations="classpath:config.xml")
public class MyConfig
...
是否有任何此类基于 XML 的属性源加载器公开可用?如果没有,那么一旦实现它,我将如何将它提供给我的应用程序?
谢谢。
【问题讨论】:
理论上应该可以开箱即用,因为属性文件可以用 xml 和普通属性格式表示。如果您想要一些自定义格式,则必须编写自己的PropertySourceLoader
或 ApplicationContextInitializer
来预加载您的文件。
【参考方案1】:
你可以查看 YamlPropertySourceLoader 是如何实现的。一旦你实现了它的方法
org.springframework.boot.env.YamlPropertySourceLoader#getFileExtensions
一旦你添加这样的东西就会被调用
@ConfigurationProperties(locations="classpath:config.xml")
但是看着 YamlPropertySourceLoader 的实现,看起来你还有很多工作要做,比如配对等。
您应该检查 yaml 是否足以满足您的需求,因为它可以让您创建结构化属性:
例如,下面的 YAML 文档:
environments:
dev:
url: http://dev.bar.com
name: Developer Setup
prod:
url: http://foo.bar.com
name: My Cool App
将转化为这些属性:
environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App
YAML 列表表示为带有 [index] 解引用器的属性键,例如这个 YAML:
my:
servers:
- dev.bar.com
- foo.bar.com
将转化为这些属性:
my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com
即使您已经准备好 XML 文档并且这就是您想要在配置中加载它们的原因,将 XML 转换为 YAML (https://github.com/FasterXML/jackson-dataformat-xml) 看起来比使用现有的 YamlPropertySourceLoader 比编写自己的 PropertySourceLoader 要简单得多。
【讨论】:
以上是关于与 @ConfigurationProperties 一起使用的自定义基于 XML 的属性源加载器的主要内容,如果未能解决你的问题,请参考以下文章
Java 微服务 乐优网络商城 day02 源代码 SpringBoot 属性注入 自动配置