我可以在 Spring 引导应用程序中使用 xml 属性文件而不是 application.properties 吗?

Can I use xml properties file instead of application.properties in a Spring Boot application?

在我们的 Spring Boot 应用程序中,我们使用 application.properties,但 Ops 团队有一个要求使用基于 XML 的属性文件。格式很简单。如果 apllication.properties 看起来像:

com.mail.host=mail_host
db.connection.port=1521

对应的xml应该是:

<XML>
    <com>
        <mail>
            <host>
                mail_host
            </host>
        </mail>
    </com>
    <db>
        <connection>
            <port>
                1521
            </port>
        </connection>
    </db>
</XML>

我们实现了它,但是 Spring Boot 仍在寻找 application.properties 以获得它的具体属性。这有点不方便。我们希望将所有属性放在一个地方,即 - XML 文件。

覆盖 Spring Boot 的默认行为以使其在 XML 文件中查找属性的最佳方法是什么? (当然,它需要一些自定义代码,因为 Spring Boot 理解简单的 属性 格式(如 key=value) 和 YAML 格式,但没有 XML.)

Spring Boot 不仅从扩展名为 .properties 和 .yaml 的文件中读取属性,而且还从 .xml 中读取属性。而不是 application.properties 只需按以下格式在您的资源文件夹中提供 application.xml:-

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>Application properties in XML format</comment>
    <entry key="com.mail.host">mail_host</entry>
    <entry key="db.connection.port">1521</entry>
</properties>

在您的 class 文件中,您可以像我们对任何属性或 yaml 文件所做的那样简单地设置值,即 @Value("${com.mail.host}") 将在它将注释的任何实例变量上设置相应的值。

如果您绝对必须从自定义 xml 源加载属性,那么这篇文章可能会有所帮助:

https://coderwall.com/p/mm5ihw/how-to-add-custom-property-source-to-spring-s-environment

它提供了一个通过 Java 配置加载自定义属性的示例 Spring 3 来自一些网络源,但调整代码以从您的 Ops 团队读取应该不会太难XML 格式化到您的 Spring 启动应用。

问题是没有编写我们自己的 XML 解析器。我们已经有了。问题是如何让 Spring Boot 从 XML 文件中读取特定的属性,因为 SB 试图在应用程序启动时自动从 application.properties 中读取它们而我们无法做到使用我们的自定义 XML 解析器。

似乎比我想象的要容易。当应用程序启动时,我们的代码调用一个静态初始化方法,该方法使用我们的自定义解析器从 XML 文件中读取道具。它通过调用将 Spring 引导特定属性设置为系统属性:

System.setProperty(...)

稍后,Spring Boot 能够获取这些属性值,就像在 application.properties.

中给出的一样