【问题标题】:Spring Boot Configuration PrioritySpring Boot 配置优先级
【发布时间】:2015-06-15 14:44:40
【问题描述】:

我正在开发一个新项目,并且是第一次使用 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 文件时从未实际运行。这样做似乎也有点小技巧。

【问题讨论】:

  • 您通常计划在哪里覆盖?环境变量和 JVM 属性覆盖 application.properties
  • 啊。我也这样做,但对于那些只是不要在罐子里放任何东西。我也不在外部容器中运行 Spring Boot 应用程序;我发现独立模式更容易管理。
  • 仅当您将应用程序服务器的存在视为给定时。在传统情况下,可能就是这种情况,但新系统可以从只需要一个 JVM 和一个 jar 的基于图像的设置开始。
  • @JustinSmith 我在这里回答了类似的问题stackoverflow.com/questions/29106579/… 也许这会有所帮助。
  • 在部署战争时使用“@PropertySource”加载属性的问题是日志属性将被忽略并且日志系统将无法工作。检查这个替代solution

标签: java spring spring-boot


【解决方案1】:

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

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

【讨论】:

  • 这行得通。作为@Dave Syer 建议的示例,您可以查看此solution
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 2014-02-10
  • 2018-06-12
  • 1970-01-01
  • 2015-12-27
相关资源
最近更新 更多