Spring Boot配置优先级

时间:2015-04-10 01:41:17

标签: java spring spring-boot

我正在开发一个新项目并首次使用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之后,似乎&#34; application.properties&#34;获得更高的优先级,并覆盖使用@PropertySource注释指定的任何内容。

我喜欢Spring,因为它允许我们遵守惯例,这使我担心我可能已经做了级联错误的属性。

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

另外,如果有人知道,我很想知道Spring-Boot中属性订单背后的原因。

注意

我已经尝试过查看SpringApplication.setDefaultProperties,但似乎无法找到获取SpringApplication Object引用的位置。 main方法在其上调用一个静态方法(run),当捆绑为WAR文件时,它实际上从不运行。这样做也似乎有点黑客。

1 个答案:

答案 0 :(得分:4)

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

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