Spring spring

Spring中文网站 > Spring Boot > Spring Boot怎么读取resources下的文件 Spring Boot怎么读取yml文件
Spring Boot怎么读取resources下的文件 Spring Boot怎么读取yml文件
发布时间:2026/07/21 11:32:18

品牌型号:联想ThinkPad X1

系统:Windows10家庭版

软件版本:Spring 5.3.7

在做Spring Boot项目时,我们会配置文件、模板、静态资源放在resources目录下,操作起来简单,但是如果要在代码里把它们读出来,不少小伙伴还是会卡一下,尤其是读取yml文件时,跟普通文本文件不太一样。接下来,我将结合实际项目中常遇到的情况,来把resources下文件的几种读取方式,以及yml文件怎么读、怎么取里面的值,跟大家一起梳理下。下面给大家介绍一下Spring Boot怎么读取resources下的文件,Spring Boot怎么读取yml文件的相关内容。

一、Spring Boot怎么读取resources下的文件

要在代码里读resources目录下的文件,办法有很多种。我们可以用ClassLoader或Class自带的getResourceAsStream方法拿到输入流去读内容,这种写法跟纯Java项目IO流读文件其实差不多,基本不依赖Spring框架API。

使用ClassLoader读取
图1:使用ClassLoader读取

既然我们项目里用了Spring的话,那么还是推荐使用ClassPathResource这个类会更顺手些,通过getInputStream拿到输入流后,读取逻辑跟前一种差不多,只是少写几行查找路径的代码。

使用ClassPathResource读取
图2:使用ClassPathResource读取

还有种省事的写法,就是在Bean里用@Value注解,把classpath下的文件路径写进去,Spring容器在启动时会自动把对应文件封装成Resource对象注入进来,直接拿来用就可以了。

使用@Value注入Resource
图3:使用@Value注入Resource

这里要注意,大家不要图省事直接把resources下的文件当成普通File对象按文件路径去读,可能IDEA中跑着一切正常,但是打成jar包部署到服务器后,resources目录的内容其实会被压缩进jar包内部,不存在独立的文件路径,所以到时候用File方式读基本会直接报错。

二、Spring Boot怎么读取yml文件

有小伙伴问Spring Boot怎么读取yml文件。如果是项目自带的application.yml,就不用做特殊处理,因为Spring Boot启动时会自动把配置加载进环境变量,我们在代码中直接用@Value注解就可以获取单个值,或者用@ConfigurationProperties把某段配置整体映射成一个Java对象。这两种用法在我们开发中都很常见,具体怎么选,就看我们配置项多不多。

使用@Value读取单个值
图4:使用@Value读取单个值

比较麻烦的是有些项目会另外建一个独立的yml文件,比如专门放某模块配置的custom.yml,这种文件Spring Boot默认不会主动加载,所以还得我们自己来想办法。有不少用户会想到用@PropertySource注解,结果发现读不出来,因为这个注解本来就是给properties文件用的,如果用来直接标yml文件肯定不会生效,所以我们要写个YamlPropertySourceFactory配合使用才可以。

YamlPropertySourceFactory代码演示
图5:YamlPropertySourceFactory代码演示

更直接的办法是用Spring自带的YamlPropertiesFactoryBean,把文件路径设进去,拿到的就是Properties对象,跟操作普通配置文件没啥差别。要是yml层级嵌套、结构复杂,直接用项目自带的SnakeYAML库读取,转成Map一层层取值也行,选哪种主要看配置复杂不复杂。

用Spring自带的YamlPropertiesFactoryBean
图6:用Spring自带的YamlPropertiesFactoryBean

以上就是Spring Boot怎么读取resources下的文件,Spring Boot怎么读取yml文件的全部内容了。我们在读取resources文件时记住要用输入流而不是File路径,这样打包上线才不会踩坑。读取yml配置时,如果是application.yml,那就直接用@Value或@ConfigurationProperties就够了。对于那些额外添加进来的yml文件就需要手动去加载了,不能指望用@PropertySource能直接读出来。

180 1563 6924