springboot加载配置项application.yml的优先级

       我们在用springboot开发项目的时候,我们在线上或预发部署的时候,经常需要把这个文件application.yml提出来,然后根据不同分组配置不同的配置项,比如配置日志参数等,比如我代码的appliction.yml(配置文件路径在–classpath:/)的有个日志配置项配置的级别是debug,然后如果我再线上分组也提出来个appliction.yml(路径是–file:./config/  既优先级最高的路径)

logging:
  level:
    root: debug

      针对上面的场景做个假设,提出来的application.yml是不是比我classpath下的application.ym优先加载,那么加载顺序是啥?如果提出来的文件没有上面日志这个配置的话。是否会把我classpath下的配置项给覆盖?该从哪里找答案,答案是从源码找答案, 我们项目用的是spring-boot-1.4.5版本。

   1  入口在SpringApplication.run(AppStart.class, args);

   2  spring在启动完成后会发布一个SpringApplicationEvent事件,既ApplicationEvent,具体就是 listeners.finished(context, (Throwable)null);   SpringApplicationEvent event = this.getFinishedEvent(context, exception);context.publishEvent(event);

  3   ConfigFileApplicationListener通过实现ApplicationListener接口中方法onApplicationEvent来监听事件

  4 通过getSearchLocations来找配置文件路径的,具体方法如下

 private Set<String> getSearchLocations() {
            Set<String> locations = new LinkedHashSet();
            String path;
            if (this.environment.containsProperty("spring.config.location")) {
                for(Iterator var2 = this.asResolvedSet(this.environment.getProperty("spring.config.location"), (String)null).iterator(); var2.hasNext(); locations.add(path)) {
                    path = (String)var2.next();
                    if (!path.contains("$")) {
                        path = StringUtils.cleanPath(path);
                        if (!ResourceUtils.isUrl(path)) {
                            path = "file:" + path;
                        }
                    }
                }
            }

            locations.addAll(this.asResolvedSet(ConfigFileApplicationListener.this.searchLocations, "classpath:/,classpath:/config/,file:./,file:./config/"));
            return locations;
        }

 通过代码可以看出查找优先级依次为–file:./config/、–file:./、 –classpath:/config/ 、–classpath:/  (注如果存在指定spring.config.location的路径,则该路径会比上面的4个优先级还要高)所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容。SpringBoot会从这四个位置全部加载主配置文件,如果高优先级中配置文件属性与低优先级配置文件不冲突的属性,则会共同存在—互补配置。如果application.yml,application-pre.yml,application-prod.yml,application-test.yml同时存在且激活,则激活的配置文件的配置项会覆盖总的配置文件的配置项(如env等于pre,则application-pre.yml配置项会覆盖application.yml的)

#主配置文件,配置了这个会优先读取里面的属性覆盖主配置文件的属性
spring:
  #激活哪一个环境的配置文件
  profiles:
    active: @env@

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot 是一个基于 Spring 框架的开发工具,它使用注解和约定优于配置的原则来简化 Spring 应用的开发。在 Spring Boot 中,将应用程序的配置信息存储在 application.yml 文件中,以便进行统一的管理。 Spring Boot 是通过使用@ConfigurationProperties注解来加载 application.yml 文件的。首先,我们需要在应用程序的配置类上添加该注解,并使用 @PropertySource 指定要加载配置文件的位置。然后,通过在属性上使用相应的注解(如 @Value、@ConfigurationProperties)来将属性与配置文件中的值进行绑定。 在加载配置文件时,Spring Boot 将自动根据属性的名称从 application.yml 文件中查找对应的值,并将其注入到应用程序中。 除了 application.yml 文件,Spring Boot 还支持加载其他格式的配置文件,如 application.properties。可以根据具体的需求选择适合的配置文件格式。 通过将应用程序的配置信息集中保存在 application.yml 文件中,可以方便地管理和修改配置。而且,Spring Boot 还提供了一些内置的功能和注解,可以方便地对配置进行校验和自动完成。 总之,Spring Boot 通过@ConfigurationProperties注解和相关的注解来加载 application.yml 文件,将应用程序的配置信息集中管理,简化了开发过程。它提供了方便的配置方式,使得配置的修改和管理更加灵活和高效。 ### 回答2: Spring Boot 是一个基于 Spring 框架的开源Java开发框架,通过自动化配置和约定式编程,大大简化了传统 Spring 应用的开发过程。 在 Spring Boot 中,application.yml 是用来存放应用的配置信息的文件。Spring Boot 在启动时会自动加载 application.yml 文件,并读取其中的配置信息,然后根据这些配置信息来完成相应的配置操作。 为了加载 application.yml 文件,Spring Boot 遵循了一定的加载顺序。首先,它会在 classpath 下找到所有的 application.yml 文件,然后按照一定的优先级进行加载。具体加载顺序如下: 1. 当前目的 classpath 下的根路径(即 src/main/resources/)下的 application.yml。 2. 当前目的 classpath 下的 config 目录下的 application.yml。 3. 当前目 jar 包外部的 config 目录下的 application.yml。 4. 当前目 jar 包内部的 config 目录下的 application.yml。 在加载这些 application.yml 文件时,Spring Boot 会根据默认的配置规则进行解析。通常,我们可以在 application.yml 中使用一些特定的前缀来标识不同的配置,比如 spring、server 等,这样 Spring Boot 就会根据这些前缀来将配置的值绑定到相应的对象中。这个过程称为自动配置。 除了 application.yml,Spring Boot 还支持其他的配置文件格式,如 application.properties、application.yaml 等。它们的加载方式和 application.yml 类似,只是文件格式不同而已。 总之,Spring Boot 可以通过加载 application.yml 来读取应用的配置信息,并根据这些配置信息完成对应的配置操作,从而简化了开发过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值