Spring 引导配置优先级

Spring Boot Configuration Priority

我正在做一个新项目,第一次使用 Spring-Boot。

传统上,当使用 Spring 和 属性 文件进行配置时,我在发行版 (WAR) 中提供了默认属性,并允许在一些记录的地方覆盖它们。

例如:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:app.properties</value>
            <value>file:${user.home}/.company/app/app.properties</value>
        </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <property name="ignoreResourceNotFound" value="true" />
</bean>

这将使我们能够在不丢失本地系统配置的情况下重新部署应用程序。

阅读 documentation on this for Spring-Boot 后,似乎 "application.properties" 中的任何内容都具有更高的优先级,并覆盖使用 @PropertySource 注释指定的任何内容。

我喜欢 Spring 因为它允许我们坚持惯例,这让我担心我可能一直在做错误的属性级联。

提供外部化属性的最合适方式是什么,其中包含分发中的合理默认值(嵌入式数据库、简单身份验证等)?

此外,如果有人知道,我很想知道 Spring-Boot.

中属性顺序背后的原因

备注

我试过查看 SpringApplication.setDefaultProperties,但似乎找不到从哪里获取对 SpringApplication 对象的引用。 main 方法在其上调用一个静态方法 (运行),当捆绑为 WAR 文件时,它实际上永远不会 运行。这样做似乎也有点麻烦。

SpringApplication 是一个 public class,因此您可以在 运行 您的应用程序之前创建一个实例并设置其属性(静态 run() 方法是只是方便)。您还可以使用 SpringApplicationBuilder,这是您在外部容器中 运行 时作为回调获得的内容。使用这些 API,您可以设置默认属性和配置文件,包括 application.properties 文件的位置 (spring.config.location) 和名称 (spring.config.name)。

请注意(根据您提供的 link)您还可以在容器中使用 JNDI 变量来覆盖或设置环境属性。如果您将多个应用程序打包到同一个 JVM 中,这也很有用。