用于@ConfigurationProperties的自定义基于XML的属性源加载器

Bra*_*lor 8 xml configuration spring-boot

我有兴趣创建一个或多个自定义属性源加载器,并@ConfigurationProperties在我的应用程序中使用这些属性源.

例如,我想开发一个属性源加载器,它能够加载XML文件并将其转换为一组属性,这些属性可以注入到带@Configuration注释的类中.

@Configuration
@ConfigurationProperties(locations="classpath:config.xml")
public class MyConfig
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

是否公开提供任何此类基于XML的属性源加载器?如果没有,那么一旦实施,我将如何将其提供给我的应用程序?

谢谢.

mom*_*ilo 4

您可以检查 YamlPropertySourceLoader 是如何实现的。一旦你实现了它的方法

org.springframework.boot.env.YamlPropertySourceLoader#getFileExtensions
Run Code Online (Sandbox Code Playgroud)

一旦你添加这样的东西就会被调用

@ConfigurationProperties(locations="classpath:config.xml")
Run Code Online (Sandbox Code Playgroud)

但是观察 YamlPropertySourceLoader 的实现,看起来您将有很多工作要做,比如配对等。

您应该检查 yaml 是否足以满足您的需求,因为它使您可以创建结构化属性:

例如,以下 YAML 文档:

environments:
    dev:
        url: http://dev.bar.com
        name: Developer Setup
    prod:
        url: http://foo.bar.com
        name: My Cool App
Run Code Online (Sandbox Code Playgroud)

将转化为以下属性:

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
Run Code Online (Sandbox Code Playgroud)

YAML 列表表示为具有 [index] 解引用器的属性键,例如此 YAML:

my:
   servers:
       - dev.bar.com
       - foo.bar.com
Run Code Online (Sandbox Code Playgroud)

将转化为以下属性:

my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com
Run Code Online (Sandbox Code Playgroud)

即使您已经准备好 XML 文档,并且这就是您想要在配置中加载它们的原因,将 XML 转换为 YAML ( https://github.com/FasterXML/jackson-dataformat-xml ) 看起来比使用现有的 YamlPropertySourceLoader更简单而不是编写自己的 PropertySourceLoader。