品牌型号:联想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。

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

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

这里要注意,大家不要图省事直接把resources下的文件当成普通File对象按文件路径去读,可能IDEA中跑着一切正常,但是打成jar包部署到服务器后,resources目录的内容其实会被压缩进jar包内部,不存在独立的文件路径,所以到时候用File方式读基本会直接报错。
二、Spring Boot怎么读取yml文件
有小伙伴问Spring Boot怎么读取yml文件。如果是项目自带的application.yml,就不用做特殊处理,因为Spring Boot启动时会自动把配置加载进环境变量,我们在代码中直接用@Value注解就可以获取单个值,或者用@ConfigurationProperties把某段配置整体映射成一个Java对象。这两种用法在我们开发中都很常见,具体怎么选,就看我们配置项多不多。

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

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

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