一、配置加载顺序


1、开发者工具Devtools 全局配置参数;

2、单元测试上的@TestPropertySource 注解指定的参数;

3、单元测试上的@SpringBootTest 注解指定的参数;


4、命令行指定的参数,如java -jar springboot.jar --name="Javaok"

5、命令行中的SPRING_APPLICATION_JSONJSON 指定参数, 如 java -Dspring.application.json='{"name":"Java技术栈"}' -jar springboot.jar

6、ServletConfig初始化参数;

7、ServletContext初始化参数;

8、JNDI参数(如 java:comp/env/spring.application.json);

9、Java系统参数(来源:System.getProperties());

10、操作系统环境变量参数;

11、RandomValuePropertySource 随机数,仅匹配:ramdom.*


12、JAR包外面的配置文件参数(application-{profile}.properties(YAML)

13、JAR包里面的配置文件参数(application-{profile}.properties(YAML)

14、JAR包外面的配置文件参数(application.properties(YAML)

15、JAR包里面的配置文件参数(application.properties(YAML)


16、@Configuration配置文件上 @PropertySource 注解加载的参数;

17、默认参数(通过 SpringApplication.setDefaultProperties 指定);


数字小的优先级越高,越先加载。所有的配置会形成互补配置,高优先级配置会覆盖低优先级配置内容。

二、远程、本地配置加载过程

  1. 获取spring.profiles.active属性的值;

    顺序:bootstrap.properties、bootstrap.yml

  2. 获取远程配置信息(nacos配置或springcloud config配置)、端口号信息等

    顺序:bootstrap-{profile}.properties、bootstrap-{profile}.yml、bootstrap.properties、bootstrap.yml

  3. 获取远程配置文件信息

  4. 获取本地配置信息


SpringBoot启动会扫描以下位置的application.yml或者 application.properties文件作为SpringBoot的默认配置文件。
-file:./config/
-file:./
-classpath:/config/
-classpath:/

  • 优先加载带profile,再来加载不带profile
  • 先是根目录下的config目录下,然后是根目录下,然后是classpath路径下的config目录下,最后是classpath路径下(即由jar包外向jar包内进行寻找)
  • properties文件优先于yml(yaml)文件

具体顺序:

带spring.profile

1、config/application-{profile}.properties(项目根目录中config目录下)

2、config/application-{profile}.yml

3、application-{profile}.properties(项目根目录下)

4、application-{profile}.yml

5、resources/config/application-{profile}.properties(项目resources目录中config目录下)

6、resources/config/application-{profile}.yml

7、resources/application-{profile}.properties(项目的resources目录下)

8、resources/application-{profile}.yml

不带spring.profile

1、config/application.properties(项目根目录中config目录下)

2、config/application.yml

3、application.properties(项目根目录下)

4、application.yml

5、resources/config/application.properties(项目resources目录中config目录下)

6、resources/config/application.yml

7、resources/application.properties(项目的resources目录下)

8、resources/application.yml

注意: 并不是高优先级的被加载了,低优先级的就不会再加载,实际上是SpringBoot会从这四个位置全部加载主配置文件,并且还能产生互相配置的效果。

总结:

  1. 优先加载操作系统层面的配置、命令行
  2. 由jar包外向jar包内进行寻找,优先查找config目录。
  3. 优先加载带profile(application-{profile}.yml)的,后加载不带profile(application.yml)的
  4. 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置

三、远程配置中心

以Nacos为例:默认远程配置优先级最高

可以通过在远程配置中心中做如下配置,设置本地配置覆盖远程配置:

spring:
  cloud:
    config:
      # 是否允许本地配置覆盖远程配置
      allow-override: true
      # 是否一切以本地配置为准,默认false
      override-none: false
      # 系统环境变量或系统属性才能覆盖远程配置文件的配置
      # 本地配置文件中配置优先级低于远程配置,默认true
      override-system-properties: true

nacos配置文件加载顺序
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。

A: 通过 spring.cloud.nacos.config.shared-dataids 支持多个共享 Data Id 的配置
B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置,多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越大,优先级越高。
C: 通过内部相关规则(应用名、扩展名 )自动生成相关的 Data Id 配置

当三种方式共同使用时,他们的一个优先级关系是:C > B >A,如图所示:
在这里插入图片描述
其中 spring.cloud.nacos.config.shared-dataids 来支持多个共享 Data Id 的配置,多个之间用逗号隔开;spring.cloud.nacos.config.refreshable-dataids 来支持哪些共享配置的 Data Id 在配置变化时,应用中是否可动态刷新, 感知到最新的配置值,多个 Data Id 之间用逗号隔开。如果没有明确配置,默认情况下所有共享配置的 Data Id 都不支持动态刷新。

注:共享DataId的配置使用默认的group即 DEFAULT_GROUP,如果自定义了group将无法获取到配置,推荐使用扩展 Data Id 的配置 ,较为灵活。

四、配置文件属性值获取

我们可以在 Spring Beans 里面直接使用这些配置文件中加载的值,如:

1、使用 @Value 注解直接注入对应的值,这能获取到 Spring 中 Environment 的值;

2、使用 @ConfigurationProperties 注解把对应的值绑定到一个对象;

3、直接获取注入 Environment 进行获取;

配置属性的方式很多,Spring boot使用了一种独有的 PropertySource 可以很方便的覆盖属性的值。

五、@PropertySource使用

@PropertySource(value = {"classpath:config/user.properties"})
@Component
@ConfigurationProperties(prefix = "user")
public class Login{
    private String username;
    private String password;
    ...
}

细心的你,会发现@PropertySource注解中属性value为一个数组,如果同时加载多个配置文件,并且不同配置文件中对同一个属性设置了不同的值,那么Spring会识别哪一个呢?

@PropertySource(value = {"classpath:config/user1.properties","classpath:config/user2.properties"})

加载顺序为从左到右顺序加载,后加载的会覆盖先加载的属性值。

六、@ImportResource使用

SpringBoot提出零xml的配置,因此SpringBoot默认情况下时不会识别项目中Spring的xml配置文件。为了能够加载xml的配置文件,SpringBoot提供了@ImportResource注解该注解可以加载Spring的xml配置文件,通常加于启动类上。

@ImportResource(value = {"classpath:/beans.xml"})
@SpringBootApplication(scanBasePackages = {"team.seagull.client"})
public class DeployApplication {
    public static void main(String[] args) {
        SpringApplication.run(DeployApplication.class, args);
    }
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐