SpringBoot学习笔记
🍈🍈🍈
SpringBoot配置文件,JSR303校验,yaml多配置…
一. 配置文件
SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的
- application.properties
- 语法结构 :key=value
- application.yml
- 语法结构 :key:空格 value
配置文件的作用 :修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;
比如我们可以在配置文件中修改Tomcat 默认启动的端口号。
1 | server.port=8081 |
1. yaml概述
YAML是 “YAML Ain’t a Markup Language” (YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)
这种语言以数据作为中心,而不是以标记语言为重点!
以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml
传统xml配置:
1 | <server> |
yaml配置:
1 | server: |
2. yaml基础语法
说明:语法要求严格!
1、空格不能省略
2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
3、属性和值的大小写都是十分敏感的。
字面量:普通的值 [ 数字,布尔值,字符串 ]
字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;
1 | # k=v |
注意:
“ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;
比如 :name: “kuang \n shen” 输出 :kuang 换行 shen
‘’ 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出
比如 :name: ‘kuang \n shen’ 输出 :kuang \n shen
3. yaml注入配置文件
yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值!
1、在springboot项目中的resources目录下新建一个文件 application.yml
2、编写一个实体类 Dog;
1 | //注册bean到容器中 |
3、思考,我们原来是如何给bean注入属性值的!@Value,给狗狗类测试一下:
1 | //注册bean |
4、在SpringBoot的测试类下注入狗狗输出一下;
1 | DemoApplicationTests { |
结果成功输出,@Value注入成功,这是我们原来的办法对吧。

5、我们在编写一个复杂一点的实体类:Person 类
1 | //注册bean到容器中 |
6、我们来使用yaml配置的方式进行注入,大家写的时候注意区别和优势,我们编写一个yaml配置!
1 | person: |
7、我们刚才已经把person这个对象的所有值都写好了,我们现在来注入到我们的类中!
1 | /* |
8、IDEA 提示,springboot配置注解处理器没有找到,让我们看文档,我们可以查看文档,找到一个依赖!

1 | <!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 --> |
9、确认以上配置都OK之后,我们去测试类中测试一下:
1 | DemoApplicationTests { |
结果:所有值全部注入成功!

4. 加载指定配置文件
@PropertySource :加载指定的配置文件;
@configurationProperties:默认从全局配置文件中获取值;
1、我们去在resources目录下新建一个person.properties文件
1 | name=火离 |
2、然后在我们的代码中指定加载person.properties文件
1 |
|

中文乱码问题
1.首先我们的IDEA文件编码一般都修改为utf-8(setting—>file encodings—->Global Encoding 和 Project Encoding 都设置为UTF-8)
2.对于 Properties 文件,重要属性 Transparent native-to-ascii conversion 主要用于转换 ascii,一般都要勾选,不然 Properties 文件中的注释显示的都不会是中文。

然后重新生成一下配置文件就好了。
5. 配置文件占位符
配置文件还可以编写占位符生成随机数
1 |
|
6. 对比
@Value这个使用起来并不友好!我们需要为每个属性单独注解赋值,比较麻烦;我们来看个功能对比图

1、@ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加
2、松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定。
3、JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性
4、复杂类型封装,yml中可以封装对象 , 使用value就不支持
结论:
配置yml和配置properties都可以获取到值 , 强烈推荐 yml;
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties;
二. JSR303数据校验
Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
引入相关依赖:
1 | <dependency> |
使用@Email让name只能支持Email格式;
1 | //注册bean |
运行结果 :

使用数据校验,可以保证数据的正确性;
1. 常见参数
1 | (message="名字不能为空") |
三. 多个配置
1. 多环境切换
profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境;
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本;
例如:
- application-test.properties 代表测试环境配置
- application-dev.properties 代表开发环境配置
但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;
我们需要通过一个配置来选择需要激活的环境:
1 | #比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试; |
2. yaml的多文档块
和properties配置文件中一样,但是使用yml去实现不需要创建多个配置文件,更加方便了 !
1 | server: |

注意:如果yml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的!
3. 配置文件加载位置
外部加载配置文件的方式十分多,我们选择最常用的即可,在开发的资源文件中进行配置!
官方外部配置文件说明参考文档

springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件:
1 | 优先级1:项目路径下的config文件夹配置文件 |
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
我们在最低级的配置文件中设置一个项目访问路径的配置来测试互补问题;
1 | #配置项目的访问路径 |
4. 拓展,运维技巧
指定位置加载配置文件
我们还可以通过spring.config.location来改变默认的配置文件位置
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;这种情况,一般是后期运维做的多,相同配置,外部指定的配置文件优先级最高
1 | java -jar spring-boot-config.jar --spring.config.location=F:/application.properties |
- 本文作者:
腾飞
- 本文链接:
https://www.tengfei.eu.org/article/d47e9c46.html
- 版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!