我正在开发一个新项目,并且是第一次使用 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)类,因此您可以在运行应用程序之前创建一个实例并设置其属性(静态 run()
方法只是为了方便起见)。您还可以使用 SpringApplicationBuilder,这是您在外部容器中运行时获得的回调。使用这些 API,您可以设置默认属性和配置文件,包括 的位置 (
文件。spring.config.location
) 和名称 (spring.config.name
) application.properties
请注意(根据您提供的链接)您还可以使用容器中的 JNDI 变量来覆盖或设置环境属性。如果您将多个应用程序打包到同一个 JVM 中,这也可能很有用。
关于java - Spring Boot配置优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29551975/