与 @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 和普通属性格式表示。如果您想要一些自定义格式,则必须编写自己的 PropertySourceLoaderApplicationContextInitializer 来预加载您的文件。 【参考方案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 的属性源加载器的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot 自定义starter

Java 微服务 乐优网络商城 day02 源代码 SpringBoot 属性注入 自动配置

LDAP 与 MYSQL .. JA-SIG CAS 与 LDAP 与 CAS 与 MySQL

python网络编程基础(线程与进程并行与并发同步与异步)

=与==&与&&| 与 || 的区别

与 0 进行比较与与某个值进行比较是不是更快?