我正在开发一个新项目并首次使用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文件时,它实际上从不运行。这样做也似乎有点黑客。
答案 0 :(得分:4)
SpringApplication
是一个公共类,因此您可以在运行应用程序之前创建实例并设置其属性(静态run()
方法只是方便)。您也可以使用SpringApplicationBuilder
,这是您在外部容器中运行时所获得的回调。使用这些API,您可以设置默认属性和配置文件,包括spring.config.location
文件的位置(spring.config.name
)和名称(application.properties
)。
请注意(根据您提供的链接),您还可以在容器中使用JNDI变量来覆盖或设置环境属性。如果您将多个应用程序打包到同一个JVM中,那么这也很有用。