SpringBoot: 配置加载顺序

综合编程 2018-04-15

在应用程序中各种配置是不可避免的,Spring中对配置的抽象(Environment)可以说是达到了极致,其中有一项尤为突出:PropertySource(配置来源),配置来源通常包括命令行参数,系统属性,系统变量,perperties文件等。在使用SpringBoot过程中,将这些技术更进一步发挥,已经可以在很多环境下使用各种各样的配置。

配置的使用通常使用${}占位符来表示,可以在 properties文件中,基于XML的applicationContext.xml配置中,基于Annotation的@Value、@ConfigurationProperies中使用。

那么在使用过程中,查找顺序配置项的如何呢?

  1. Devtools global settings properties on your home directory ( ~/.spring-boot-devtools.properties
    when devtools is active). 用于开发环境。
  2. @TestPropertySource
    annotations on your tests. (用于单元测试环境)
  3. @SpringBootTest#properties
    annotation attribute on your tests.(用于单元测试环境)
  4. Command line arguments
    . (命令行参数 java -jar xxx.jar args, 其中参数形式是 --key1=value1 --key2=value2
  5. Properties from
    SPRING_APPLICATION_JSON

    (inline JSON embedded in an environment variable or system property)

  6. ServletConfig

    init parameters.

  7. ServletContext

    init parameters.
  8. JNDI attributes from
    java:comp/env

    .
  9. Java System properties ( System.getProperties()
    ).
  10. OS environment variables.
  11. A RandomValuePropertySource
    that only has properties in random.*
    . (这个是用于取一个随机数,例如 random.int, random.long, random.uuid, random.int(10), random.int[10,100]等等)
  12. Profile-specific application properties outside of your packaged jar ( application-{profile}.properties
    and YAML variants) 其实包括 .properties,.xml,.yml,yaml,详情见下面说明。
  13. Profile-specific application properties packaged inside your jar ( application-{profile}.properties
    and YAML variants)
  14. Application properties outside of your packaged jar ( application.properties
    and YAML variants).
  15. Application properties packaged inside your jar ( application.properties
    and YAML variants).
  16. @PropertySource

    annotations on your @Configuration
    classes.
  17. Default properties (specified using
    SpringApplication.setDefaultProperties

    ).

对于第12, 13, 14, 15 项,详细情况是这样的:

在程序启动是,会查找并加载Profiles文件,它的详细过程是:

1) 取得要激活哪些profiles,以及这些profile可能存放的位置。

1.1) 使用PropertySources.get("spring.profiles.active")获取到要激活哪些Profiles,如果不指定会使用默认的名字:application。

当然了,也可以使用编程的方式设置: 在程序开始之前执行代码:SpringApplication.setAdditionalProfiles("yourProfile")

1.2) 使用PropertySources.get("spring.config.location")获取要激活的profiles可能存放的位置。如果不指定该属性,会使用默认位置:

file:./config/
file:./
classpath:./config/
classpath:./ 

2) 从"spring.config.location指定的位置去加载"spring.profiles.active指定的配置文件。

配置文件以 [.properties, .xml, .yml, yaml]顺序查找,找不到的情况下会找下一个。

examples:

如果没有配置spring.profiles.active, spring.config.location, 则会找

file:./config/application-default.[peroperties|xml|yml|yaml]
file:./application-default.[peroperties|xml|yml|yaml]
classpath:./config/application-default.[peroperties|xml|yml|yaml]
classpath:./application-default.[peroperties|xml|yml|yaml]

file:./config/application.[peroperties|xml|yml|yaml]
file:./application.[peroperties|xml|yml|yaml]
classpath:./config/application.[peroperties|xml|yml|yaml]
classpath:./application.[peroperties|xml|yml|yaml]

您可能感兴趣的

Configuring a datasource-proxy in Spring Boot Have you ever heard about datasource proxies? No worries, it’s not complicated at all. Let’s say you want to access the database from an appl...
SpringBoot-Mapper中Sql语句写法【原创】 最近在学习和使用SpringBoot框架并进行后台项目的开发,对于SpringBoot的介绍就不再做记录,今天记录一下dao层的sql写法,初学时经常忘。 在项目中,我们一般定义一个mapper目录,存放一个个接口类,每个接口类中定义方法,然后在resource目录下定义对应名称的mapp...
spring boot(18)-servlet、filter、listener servlet、filter、listener的用法就不讲了,只讲如何在spring boot中配置它们。有两种方式,一种是从servlet3开始提供的注解方式,另一种是spring的注入方式 servlet注解方式 servl...
REST API using Spring Boot and jOOQ 17 Feb 2018 - by 'Maurits van der Schee' Almost every backend application that is created today has a REST API. And most "serious" applications hav...
spring-boot-data-jpa nativeQuery 详解 问题: 1:一般情况下,用spring-boot data jpa查询sql稍有点多,本来一条sql解决的事情,一定要几条, 如何优化成一条sql解决,还能带上分页? 2:这个时候@Query注解里面的nativeQuery就可以派上用场 (用left join fetch也可以优化成一条s...