Spring spring

Spring中文网站 > Spring Boot > Spring Boot启动读取yml原理 Spring Boot如何读取指定文件
Spring Boot启动读取yml原理 Spring Boot如何读取指定文件
发布时间:2026/08/20 11:25:19

品牌型号:联想ThinkPad X1

系统:Windows10家庭版

软件版本:Spring 5.3.7

我们用Spring Boot做项目时,几乎每天都在跟配置文件打交道,Spring Boot有两种配置文件格式,yml格式简洁、层级清晰,比老式的properties文件看着舒服多了,大部分项目现在都走yml格式。很多人没有想过这背后的加载机制,Spring Boot启动的时候怎么找到yml,怎么把里面的内容解析成可用的配置,这个过程是怎么跑的?另外项目里有时候需要读取一个自定义的配置文件,不走默认路径,该怎么处理?下面就给大家介绍一下Spring Boot启动读取yml原理,Spring Boot如何读取指定文件的相关内容。

一、Spring Boot启动读取yml原理

Spring Boot自动读取yml文件的背后其实走了一套固定的流程,整个过程的入口在SpringApplication.run()方法里,当我们应用启动时,Spring Boot会触发ApplicationEnvironmentPreparedEvent事件。这个事件触发之后,ConfigFileApplicationListener或者ConfigDataEnvironmentPostProcessor会介入并负责把外部配置文件加载进来。

Spring Application.run()方法
图1:Spring Application.run()方法

在加载的时候有一套默认的查找路径,按照优先级从高到低依次查找:先当前目录下的config子目录,再到当前目录,接着到classpath下的config目录,最后到classpath根目录。一般我们在开发的时候会习惯把yml放在resources下,对应的就是classpath根目录,是优先级最低的位置,所以如果同一个配置项在多个位置都出现了,高优先级的会覆盖低优先级的。

yml存放位置
图2:yml存放位置

默认文件名为application,格式支持yml和properties两种,yml的解析依赖的是SnakeYAML这个库,解析完成后,yml里的层级结构会被打平成键值对的形式,存入Environment对象,后续通过@Value或者@ConfigurationProperties注解取值。

yml配置文件
图3:yml配置文件

多环境配置通过application-{profile}.yml实现,Spring.profiles.active指定激活哪个,对应文件在默认配置之后加载,同名配置项会覆盖默认配置的值。

二、Spring Boot如何读取指定文件

通常情况下Spring Boot只认application.yml这个文件,但我们在实际项目中经常会有读取自定义配置文件的需求,比如单独维护一份数据库配置或者按模块拆分配置文件,这种情况下就需要我们主动告诉Spring Boot去哪里找。

比较直接的方式是用@PropertySource注解,在配置类上加上这个注解,指定文件路径,Spring Boot启动时就会把对应文件加载进Environment。不过大家要注意@PropertySource默认是不支持yml格式的,只能读properties文件,如果一定要用yml,需要自己实现一个YamlPropertySourceFactory,然后在注解里通过factory参数指定,稍微麻烦一点但可以解决问题。在Spring Boot 2.4之后引入了spring.config.import,这是目前更推荐的方式,在application.yml里加一行配置。

import自定义配置
图4:import自定义配置

这样Spring Boot启动时会自动把指定文件一并加载进来,支持yml格式,路径也比较灵活,如果有多个文件那就用逗号隔开。如果是在应用启动之前就需要动态指定配置文件路径,可以通过启动参数传入。

启动前动态指定文件路径
图5:启动前动态指定文件路径

这个参数会替换掉默认的配置文件路径,所以如果还需要保留application.yml,要把两个路径都写进去,用逗号分隔。如果只是想在默认路径基础上额外追加,用spring.config.additional-location更合适,不会影响默认文件的加载。

还有一种情况就是有时候我们需要读取配置文件里的内容映射到一个Java对象上,这时候配合@ConfigurationProperties使用比较好,我们定义一个配置类,加上@ConfigurationProperties(prefix = "xxx"),再通过@PropertySource或者import把文件加载进来,属性会自动按前缀绑定,不需要一个个写@Value。

编写配置类绑定实体类
图6:编写配置类绑定实体类

以上就是Spring Boot启动读取yml原理,Spring Boot如何读取指定文件的全部内容了。我们理清楚yml的加载机制,再掌握几种读取指定文件的方式,配置这块基本就不会再踩什么坑了,默认流程理解了,出问题就知道往哪里查。如果我们在工作中要去对自定义的文件做读取,可以根据场景选对上面介绍的方法,代码也会干净很多。配置看着是小事,但项目里因为配置没搞清楚导致的问题其实不少,打好这个基础还是值得的。

 

180 1563 6924