java - Spring Boot配置优先级

标签 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 后,似乎“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/

相关文章:

java - 如何防止 Excel 单元格格式发生变化

java - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : Unknown column 'topic_id' in 'field list'

java - Spring Boot 从配置文件加载列表返回空列表

java - 从共享首选项中记住上一个数组

Java:如何读取文本文件的每一行并将每一行设置为数组元素?

java - 带有 jdk 11 : Error creating bean with name 'entityManagerFactory' 的 Spring Boot 2.1.1

java - Spring Wiring 泛型类型的动态 bean

java - Spring-Boot:依赖注入(inject)取决于配置(和使用接口(interface))

java - 使用 start.spring.io 的 spring 项目 stub 在没有 xml-conf 的情况下交付 jsp View 的最快方法

spring-boot - Cassandra + SpringBoot,java.lang.ClassNotFoundException : com. datastax.oss.protocol.internal.SegmentCodec