【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 ... 阅读详情

相关推荐

从Mate到Mate40 Pro+:华为旗舰核心配置演进与选购避坑指南

本文回顾了华为Mate系列从初代到Mate40 Pro+的核心配置演进历程,重点分析了处理器性能、影像系统、屏幕设计及续航快充的技术突破。针对选购需求,提供了区分版本、5G选择及存储配置的实用避坑建议,帮助消费者明智选择华为旗舰机型。

weixin_30015371的博客 494

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

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

竹林幽深 751

软考软件评测师备考避坑指南:过来人告诉你这5个章节最容易丢分(附2024最新考纲解析)

本文为软考软件评测师考生提供备考避坑指南,深度解析5个高频失分章节,包括标准化与信息化基础、中间件技术、软件测试模型、白盒测试覆盖准则和性能测试指标。文章结合2024最新考纲,分享实战技巧和记忆口诀,帮助考生精准打击失分重灾区,提升备考效率。

weixin_29223603的博客 467

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

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

ACGkaka的博客 8430

Outlook邮件备份全攻略:从导出到导入的完整流程(附常见问题解决)

本文提供了一份详尽的Outlook邮件备份全攻略,涵盖从导出到导入的完整流程。重点解析了经典桌面版Outlook的.pst文件备份方法、进阶的智能筛选备份策略,以及如何通过导入恢复和工具验证确保备份可用。同时,文章还介绍了构建自动化备份体系与异地容灾的最佳实践,并附有常见问题解决方案,帮助用户建立可靠的邮件数据安全防线。

weixin_29248611的博客 894

如何使用superpowers

"这个 bug 帮我修一下" → 我会自动走 systematic-debugging → TDD → verify 流程。- "帮我添加一个登录功能" → 我会自动走 brainstorming → plan → TDD → verify 流程。只要任务有 1% 的可能性适用某个技能,我就会先调用它再行动。→ TDD(测试驱动开发)→ verification(验证)→ code review(代码审查)提出需求 → brainstorming(头脑风暴)→ writing-plans(编写计划)

xiaojingjianqiang的博客 611

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

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

398701344努力加油! 1230

3DGS实战避坑指南:从零搭建到成功训练

本文详细介绍了3D Gaussian Splatting(3DGS)从环境配置到成功训练的实战避坑指南。涵盖git clone的正确使用、依赖安装的隐藏陷阱、CUDA版本兼容性解决方案、首次训练验证、常见报错急救方案、性能优化技巧及可视化调试方法,帮助开发者高效搭建和训练3DGS模型。

weixin_29053383的博客 365

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

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

20000_ZuuuuYao的博客 1748

Agentic-Desktop-Pet:构建本地智能桌面助手的架构与实践

智能体(Agent)作为人工智能领域的重要概念,是指能够感知环境、自主决策并执行任务以实现目标的软件实体。其核心原理在于结合感知、决策与执行模块,通过大语言模型(LLM)等推理引擎处理信息并驱动行动。这种架构的技术价值在于将AI的认知能力与具体的操作系统环境深度融合,从而创造出能主动理解用户上下文、提供个性化服务的智能伙伴。在应用场景上,智能体技术正从云端对话机器人向本地化、场景化的桌面助手演进,旨在解决传统自动化工具缺乏智能、而纯聊天机器人脱离操作环境的问题。本文探讨的Agentic-Desktop-Pe

weixin_27210125的博客 623

【思博伦】史上最详细Spirent TestCenter测试仪使用教程精讲(一)!图解超赞超详细!!!

3. 在弹出的界面中,找到菜单栏中的“Connect/Create”,选择下拉框中的“Connect to Physical/Visual Chassis”,在弹出的对话框中输入思博伦测试仪的IP地址:192.168.6.244,点击“OK”;说明:目前我们只需要使用到Raw Stream Block,不需要用到Bound Stream Block。说明:如果要使用100G模式,由于硬件限制,必须连续3个面板端口同时配置为100G使用。打开安装包,并按照提示按照即可。

风云说通信 6479

Spring Boot的配置文件

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

m0_74097130的博客 3045

第一章:Profibus DP通信简介

PROFIBUS (Process Fieldbus)的缩写,是一种国际化的、开放的、不依赖于设备生产商的现场总线标准。它广泛应用于制造业自动化、流程工业自动化和楼宇、交通、电力等其他工业自动化领域。串行现场总线主要用来连接数字现场设备或中、低功能的系统,如传感器、执行机构、变送器、可编程序控制器(PLC)、数控装置(NC)、编程设备、本地人机接口等。

qq_22560021的博客 4895

spring boot 配置文件加载位置

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

qq_15695787的博客 2365

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

蚩尤后裔-汪茂雄 6万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

wxd0116的博客 1355

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、付费专栏及课程。

余额充值