【Spring Boot】(7)、配置文件加载位置

Spring Boot中配置文件加载失败的报错:深度解析与实战解决方案 Spring Boot开发中配置文件加载失败常见问题及解决方案:包括配置文件位置错误(需放在src/main/resources或jar同级目录)、多环境配置冲突(缺失Profile文件或命名不规范)、外部配置覆盖问题(参数使用不当)以及YAML格式错误(缩进敏感)。排查方法包括验证文件位置、检查加载顺序、启用DEBUG日志,并提供自定义配置加载、属性验证等高级解决方案。建议使用IDE插件或在线工具检测YAML格式,注意不同Spring Boot版本的配置差异,及时升级以获得更好的错误提示。 阅读详情

Spring Boot启动会扫描以下位置的application.properties/yml文件作为Spring Boot默认配置文件:

Spring Boot官方文档章节:加载application.properties配置文件

  • 外置,在相对于应用程序运行目录的/config子目录里

  • 外置,在应用程序运行的目录里

  • 内置,在resources/config包内

  • 内置,在classpath根目录(resouces目录下)


源码解析

ConfigFileApplicationListener.class
public class ConfigFileApplicationListener
		implements EnvironmentPostProcessor, SmartApplicationListener, Ordered {

    //...
    
    //默认配置文件名
    private static final String DEFAULT_NAMES = "application";

    // Note the order is from least to most specific (last one wins)
	private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
    
    public static final String CONFIG_LOCATION_PROPERTY = "spring.config.location";
    
    public static final String CONFIG_NAME_PROPERTY = "spring.config.name";
    
    //...
}
ConfigFileApplicationListener.load()
public void load() {
        this.propertiesLoader = new PropertySourcesLoader();
        this.activatedProfiles = false;
        this.profiles = Collections.asLifoQueue(new LinkedList<Profile>());
        this.processedProfiles = new LinkedList<Profile>();

        //上节讲述过,会获取当前profiles激活的环境,默认为default
        Set<Profile> initialActiveProfiles = initializeActiveProfiles();
        this.profiles.addAll(getUnprocessedActiveProfiles(initialActiveProfiles));
        if (this.profiles.isEmpty()) {
            for (String defaultProfileName : this.environment.getDefaultProfiles()) {
                Profile defaultProfile = new Profile(defaultProfileName, true);
                if (!this.profiles.contains(defaultProfile)) {
                    this.profiles.add(defaultProfile);
                }
            }
        }

        this.profiles.add(null);

        while (!this.profiles.isEmpty()) {
            Profile profile = this.profiles.poll();
            //获取配置文件的查找路径
            for (String location : getSearchLocations()) {
                if (!location.endsWith("/")) {
                    // location is a filename already, so don't search for more
                    // filenames
                    load(location, null, profile);
                }
                else {
                    for (String name : getSearchNames()) {
                        load(location, name, profile);
                    }
                }
            }
            this.processedProfiles.add(profile);
        }

        addConfigurationProperties(this.propertiesLoader.getPropertySources());
    }
ConfigFileApplicationListener.getSearchLocations()
private Set<String> getSearchLocations() {
    Set<String> locations = new LinkedHashSet<String>();
    //用户自定义的配置文件,优先加载,通过spring.config.location指定
    if (this.environment.containsProperty(CONFIG_LOCATION_PROPERTY)) {
        for (String path : asResolvedSet(
            this.environment.getProperty(CONFIG_LOCATION_PROPERTY), null)) {
            if (!path.contains("$")) {
                path = StringUtils.cleanPath(path);
                if (!ResourceUtils.isUrl(path)) {
                    path = ResourceUtils.FILE_URL_PREFIX + path;
                }
            }
            locations.add(path);
        }
    }
    
    //获取查找路径
    locations.addAll(
        asResolvedSet(ConfigFileApplicationListener.this.searchLocations,
                      DEFAULT_SEARCH_LOCATIONS));
    return locations;
}
ConfigFileApplicationListener.asResolvedSet()
private Set<String> asResolvedSet(String value, String fallback) {
    List<String> list = Arrays.asList(StringUtils.trimArrayElements(
        StringUtils.commaDelimitedListToStringArray(value != null
                                                    ? this.environment.resolvePlaceholders(value) : fallback)));
    //将元素进行反转,所以查找的路径实际跟DEFAULT_SEARCH_LOCATIONS所定义的顺序刚好相反。
    Collections.reverse(list);
    return new LinkedHashSet<String>(list);
}

ConfigFileApplicationListener.getSearchNames()
private Set<String> getSearchNames() {
    //如果环境中有以spring.config.name的配置,则以该值作为配置文件名
    if (this.environment.containsProperty(CONFIG_NAME_PROPERTY)) {
        return asResolvedSet(this.environment.getProperty(CONFIG_NAME_PROPERTY),
                             null);
    }
	//获取默认的配置文件名,默认为application
    return asResolvedSet(ConfigFileApplicationListener.this.names, DEFAULT_NAMES);
}
PropertySourcesLoader.getAllFileExtensions()
public Set<String> getAllFileExtensions() {
    Set<String> fileExtensions = new LinkedHashSet<String>();
    //获取所有配置文件的后缀名,分别是properties,xml,yml,yaml
    for (PropertySourceLoader loader : this.loaders) {
        fileExtensions.addAll(Arrays.asList(loader.getFileExtensions()));
    }
    return fileExtensions;
}

所以其实Spring Boot支持四种配置文件格式:

  • properties

  • xml

  • yml

  • yaml

    而xml用的少,yml和yaml其实是一样的格式,所以常用的是properties和yml。


PropertySourcesLoader.doLoadIntoGroup()
private PropertySource<?> doLoadIntoGroup(String identifier, String location,
				Profile profile) throws IOException {
    Resource resource = this.resourceLoader.getResource(location);
    PropertySource<?> propertySource = null;
    StringBuilder msg = new StringBuilder();
    if (resource != null && resource.exists()) {
        String name = "applicationConfig: [" + location + "]";
        String group = "applicationConfig: [" + identifier + "]";
        propertySource = this.propertiesLoader.load(resource, group, name,
                                                    (profile == null ? null : profile.getName()));
        if (propertySource != null) {
            msg.append("Loaded ");
            handleProfileProperties(propertySource);
        }
        else {
            msg.append("Skipped (empty) ");
        }
    }
    else {
        msg.append("Skipped ");
    }
    msg.append("config file ");
    msg.append(getResourceDescription(location, resource));
    if (profile != null) {
        msg.append(" for profile ").append(profile);
    }
    if (resource == null || !resource.exists()) {
        msg.append(" resource not found");
        this.logger.trace(msg);
    }
    else {
        this.logger.debug(msg);
    }
    return propertySource;
}

总结

  • 分别从file:./config/, file:./, classpath:/config/, classpath:/ 这四个位置依次读取后缀名为properties, xml, yml, yaml的配置文件

  • 优先级由高到低,对于相同的属性配置,高优先级的配置会覆盖优先级低的配置;对于其他不同的属性配置,则会进行互补。

  • 优先级相同的情况下,同时有application.properties和application.yml,那么application.properties里面的属性就会覆盖application.yml里的属性,因为properties比yml优先加载。

​在查看源码的时候,在getSearchLocations()代码中,提示可以通过spring.config.location来改变默认的配置文件位置:项目打包好以后,使用命令行参数的形式--spring.config.location=…来启动项目,用来指定配置文件的新位置,从而使指定的新配置文件和包内的默认加载的配置文件共同起作用行程互补配置。

1java -jar spring-boot-02-config-SNAPSHOT.jar --spring.config.location=F

博主在写这篇博文前,遇到一个无法解决的问题,见链接:SpringBoot加载配置文件优先级问题?


====================打个广告,欢迎关注====================

QQ:
412425870
微信公众号:Cay课堂

csdn博客:
http://blog.youkuaiyun.com/caychen
码云:
https://gitee.com/caychen/
github:
https://github.com/caychen

点击群号或者扫描二维码即可加入QQ群:

328243383(1群)




点击群号或者扫描二维码即可加入QQ群:

180479701(2群)




Spring Boot入门篇 | Spring Boot 1 一、什么是Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是 Spring Boot 其实不是什么新的框架,它默认配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring ... 阅读详情

相关推荐

AlertManager的使用(邮件和微信告警)

一、AlertManager概述 Prometheus 包含一个报警模块,就是我们的 AlertManager,Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重,降噪,分组等,是一款前卫的告警通知系统。 Alertmanager是一个独立的告警模块,接收Prometheus等客户端发来的警报,之后通过分组、删除重复等处理,并将它们通过路由发送给正确的接收器;告警方式可以按照不同的规则发送给不同的模块负责人,Alertman

weixin_45880055的博客 2万+

太强 ! 精通 Spring Boot 配置文件高级用法

通过编程方式指定的配置文件。

竹林幽深 751

Spacedesk保姆级教程:用旧平板给Windows电脑当副屏,从安装到避坑一步到位

本文提供Spacedesk保姆级教程,教你如何将旧平板变成Windows电脑的副屏,从软件安装到网络配置、显示优化及声音交互,一步步避开常见陷阱。通过WiFi实现扩展屏功能,支持4K分辨率和60Hz刷新率,让闲置设备焕发新生。

weixin_42524945的博客 1万+

SpringBoot 如何将配置文件挂到 jar 包外面?

SpringBoot 如何将配置文件挂到 jar 包外面?

ACGkaka的博客 8430

【天线与电波传播】电波传播部分 第7章 电波传播的基础知识3

菲涅尔区与菲涅尔带的基本知识

Chen59_2328的博客 1601

【gcc】跨版本兼容实战:高版本编译程序在低版本glibc环境下的部署方案

本文针对高版本gcc编译的程序在低版本glibc环境下部署的兼容性问题,提供了四种实战解决方案:静态编译的局限性、容器化部署的优雅方案、使用Devtoolset工具链的官方支持,以及最通用灵活的打包依赖SO发布方案。重点剖析了通过设置RPATH和Interpreter或使用patchelf工具,实现程序与自带库的独立部署,有效解决glibc版本鸿沟。

weixin_29237635的博客 362

SpringBoot之浅析配置项解析(二)

我们在上一篇文章中简单的说了一些SpringBoot配置属性相关的一些内容,我们在这篇文章中接着上一篇的文章继续进行分析。我们在上一篇文章中提到了这样一个类:ConfigFileApplicationListener,从类名来看的话这是一个配置文件应用监听器,这个类主要的一个作用是在 refresh context之前解析默认的配置文件。首先我们来看一下它的UML类图: ConfigFile

398701344努力加油! 1230

宏基因组功能注释实战:从CAZyme到VFDB的完整流程(含数据库下载与脚本优化)

本文详细介绍了宏基因组功能注释的完整流程,涵盖CAZyme、eggNOG、CARD和VFDB四大核心数据库的实战应用。从环境配置、数据库下载与预处理到注释流程执行与优化,提供了全面的操作指南和脚本优化建议,帮助研究人员高效完成宏基因组数据分析。特别针对CAZyme注释等关键步骤给出了参数优化方案和常见问题排查方法。

weixin_29289821的博客 295

SpringBoot 项目启动时指定外部配置文件

配置文件放在外部,注册中心和配置中心写在bootstrap.yml中。切换环境时可以随时编辑配置文件。

20000_ZuuuuYao的博客 1748

海康visionmaster开发笔记10-集成HALCON第三方算子到VM工具箱的方法

海康visionmaster开发笔记10-HALCON第三方算子到VM工具箱的方法

视觉人机器视觉的博客 4347

DeepSeek Harness 工程实践与高级特性:从测试到安全的完整指南

AI Agent 能执行命令、读写文件、自主决策,能力越强风险越大——删文件、泄密钥、死循环、竞态条件随时可能发生。本文是 DeepSeek Harness 系列第三篇,深入剖析其工程实践与高级特性:从单元测试到真实 API 冒烟测试的分层策略,拒绝 Mock 依赖、坚持"验证世界而非自我报告";从正交结果、规范化契约到 Dispose 静止的防御式编程铁律;以及跨平台多层进程沙箱、文件系统版本守卫、fail-closed 审批机制、模型编写的工作流引擎与上下文压缩等高级能力。

program哲学 207

Spring Boot的配置文件

application.properties和application.yml(也可application.yaml,这里以.yml为准)。如果两个文件同时存在且在同一目录下,application.properties文件的优先级更高,它是Spring Boot默认的配置文件(类型)。建议不要同时使用这两种类型的配置文件,这会导致系统维护问题,也会导致配置失效。

m0_74097130的博客 3045

数字电视中的AD(Audio Description)音频描述技术详解

AD(Audio Description)音频描述是一种辅助技术,旨在帮助视障人士更好地理解视觉内容。通过在节目或视频的自然停顿处插入额外的语音叙述来解释屏幕上的视觉信息,如人物动作、场景变化、文字说明等,从而让视力受损的人士也能获得完整的观影体验。AD服务不仅限于电视广播,也广泛应用于电影、剧院表演、在线视频平台等领域。PID:用于标识和区分不同的音频流。PMT表:提供每个音频流的详细信息,包括PID、编解码器类型和语言代码。时间戳:PTS和DTS用于同步音频与视频内容。解复用。

以实战经验介绍行业知识 741

spring boot 配置文件加载位置

1.项目中的配置文件 springboot 启动时 会默认扫描以下位置的application.properties 或者 application.yml 文件,作为spring boot的默认配置文件 file:./config/ 项目根路径的config文件夹中 file:./ 项目根路径中 c...

qq_15695787的博客 2365

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring Boot @PropertySource 加载配置文件、@ImportResource 导入Spring 配置文件、YamlPropertiesFactoryBean 读取 yml 文件

目录 需求背景 项目结构 @PropertySource 加载指定配置文件 资源配置文件 测试运行 需求背景 1、通过《Spring Boot 全局配置文件》与《@Value 取赋值详解与 @ConfigurationProperties 对比》已经知道使用“@Value”注解与“@ConfigurationProperties”可以从全局配置文件“application.prope...

蚩尤后裔-汪茂雄 6万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring Boot 项目中配置文件加载原理深度解析

通过多种方式指定额外的配置文件路径(优先级高于默认路径):​Spring Boot 的配置文件加载机制通过多层级优先级、多环境支持和灵活的扩展点,为开发者提供了强大的配置管理能力。理解其核心原理(如加载顺序、环境激活、配置合并)有助于在开发中避免配置冲突,实现不同环境的高效部署。在实际项目中,建议遵循 “公共配置放主文件,环境特定配置放 Profile 文件” 的原则,并结合命令行参数和环境变量实现动态配置,提升项目的可维护性与灵活性。

wxd0116的博客 1355

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SpringBoot中配置文件加载位置与优先级

【1】项目内部配置文件 spring boot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 –file:./config/ –file:./ –classpath:/config/ –classpath:/ 即如下图所示: 以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高...

小小默:进无止境 5万+

Spring Boot 配置文件启动加载顺序

Spring Boot的启动加载顺序是一个涉及多个步骤和组件的过程。Spring Boot通过一系列默认设置简化了应用程序的配置,使得开发者能够快速地搭建和部署应用。为了实现这一目标,Spring Boot采用了一种分层和优先级机制来加载配置文件。

A_aspectJ的博客 3344

Spring Boot 与 Spring Cloud 应用配置文件分类详解

Spring Boot与Spring Cloud配置文件详解 本文系统介绍了Spring Boot和Spring Cloud的YAML配置文件体系。主要内容包括: 配置文件分类: Spring Boot按环境分为主配置(application.yml)和环境特定配置(application-{profile}.yml) Spring Cloud新增bootstrap.yml引导配置和配置中心文件 加载顺序: Spring Boot按优先级从命令行参数到默认属性共14级加载顺序 Spring Cloud优先加

python15397的博客 1089

Spring Boot 配置文件加载优先级全解析

Spring Boot 的配置加载机制通过灵活的优先级规则,为多环境配置管理提供了强大支持。理解其加载顺序和覆盖逻辑,能够帮助开发者避免配置冲突,提升应用的可维护性。在实际项目中,建议结合容器化部署和配置中心(如 Spring Cloud Config),实现更高效的配置管理。

qq479850581的博客 1627

【Spring Boot】7、配置文件的作用

1、配置文件的使用 修改配置方式1:src\main\resources\application.properties #修改端口号 server.port=8081 #端口号后需额外添加字符 server.servlet.context-path=/zed 访问:http://localhost:8081/zed/hello @RestController public class HelloWorld { @GetMapping("/hello") public String

Mithrandir_74的博客 722

Spring Boot配置文件加载位置的优先级

一. 配置文件加载位置:   1. springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件     –file:./config/    –file:./    –classpath:/config/    –classpath:/  优先级由高到底,高优先级的配置会覆盖低优...

夜聆离殇的博客 397

spring boot配置文件

SpringBoot使用一个全局的配置文件(核心配置文件)配置文件名在约定的情况下名字是固定的;配置文件名称只能叫application.properties 或者 application.yml配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好了2.2 两种配置文件的格式在springboot框架中,resource文件夹里可以存放配置的文件有两种:properties和yml。可共存和混用。

m0_64473908的博客 1293

java加载spring配置文件路径_SpringBoot配置文件的加载位置实例详解

springboot采纳了建立生产就绪spring应用程序的观点。 Spring Boot优先于配置的惯例,旨在让您尽快启动和运行。在一般情况下,我们不需要做太多的配置就能够让spring boot正常运行。在一些特殊的情况下,我们需要做修改一些配置,或者需要有自己的配置属性。SpringBoot启动会扫描以下位置的application.yml或者 application.properties文...

weixin_28699741的博客 598

Spring Boot 配置文件加载

1、 配置文件加载的优先级 –file:./config/ 在应用程序的config目录中,应用名就是如:credit-insure-after –file:./ –classpath:/config/ 类路径的config目录中resources –classpath:/ 优先级由高到低,互补配置,高优先级的配置会覆盖低优先级的配置 ...

yubin1285570923的博客 1040

7.spring boot配置文件的位置及加载顺序

配置文件的位置 1)项目内部的配置文件 properties和yml中的配置,相互补充;如果冲突,则properties优先级高 spring boot默认能够读取的application.properties/application.yml这2个文件,可以存在于一下4个文件: file:项目根目录/config file:项目根目录 classpath:项目根目录/config classpa...

mydaima的博客 174
上一篇: 【Spring Boot】(6)、Profile
下一篇: 【Spring Boot】(8)、外部配置加载顺序
caychen
博客等级 码龄9年 110粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值