3 配置
Spring Boot 使用一个全局的配置文件,配置文件的文件名是固定的。
- application.properties
- application.yml
配置文件用来修改 Spring Boot 配置的默认值。
例:
1 | server: |
如果是 xml,可能是这么写的:
1 | <server> |
很明显 yml 配置更简洁。
3.1 YAML
YAML(YAML Ain’t Markup Language):
.yml 是 YAML 语言的文件,以数据为中心,比 json、xml 等更适合做配置文件。
语法:
k: v
表示键值对。冒号后必须有空格。
用缩进来控制层级关系,只要是左对齐的一列数据,就是同一层级的。
大小写敏感。
值的写法:
字面量:数字,字符串,布尔。
字符串:
“”:双引号中会转义字符。
‘’:单引号中不会转义字符,\n 输出还是 \n。
对象、map(属性和值):
1 | person: |
或:
1 | person: {name: zhangsan,age: 20} |
数组(list,set):
1 | pets: |
或:
1 | pets: [cat,dog,pig] |
在 SpringBoot 中使用配置文件值注入:
yaml:
1 | Person: |
Bean:
1 | @Component |
配置了注解之后,idea 提示添加依赖,帮助自动生成配置文件和 Bean 的匹配:
1 | <dependency> |
之后在单元测试中输出Person,会得到配置文件中注入的数值。
如果配置文件中出现中文乱码,在 file Encoding 设置中选择UTF-8,勾选后面的选项。(IDEA)
3.2 @Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装(如map) | 支持 | 不支持 |
松散绑定:指person-name能与perisonName绑定
JSR303数据校验:例如在属性前加@Email注解,可以判断配置文件中传入的值是否符合邮箱规则。
3.3 @PropertySource与@ImportResource
@PropertiesSource:读取指定配置文件。放在bean定义前。
@ImportResource:导入Spring配置文件,让配置文件中的内容生效。SpringBoot中没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别,想让Spring的配置文件生效,就把这个注解标注在一个配置类上。
SpringBoot推荐给容器中添加组件的方式:使用全注解的方式。写配置类。
1 | @Configuration |
3.4 配置文件占位符
3.4.1 随机数
1 | person.age=${random.int} |
3.4.2 占位符
获取之前配置的值,如果没有可以用:指定默认值。
1 | person.dog.name=${person.name:Jack}+Dog |
3.5 Profile
SpringBoot提供了项目在不同环境下运行时,快速切换配置文件的方法。
3.5.1 yaml文档块方式
1 | servcer: |
上面这段配置使用的是dev模式,端口8082。
3.5.2 多profile文件
不同环境的配置文件命名为:application-dev.properties 或 application-prod.properties。
在application.properties中配置 spring.profiles.active=dev 以切换配置。
还可以使用命令行方式激活:在运行设置,program arguments 中如下设置。
1 | --spring.profiles.active=dev |
3.6 配置文件加载位置
SpringBoot 会扫描以下位置的 application.properties 或者 application.yml 文件u欧维SpringBoot的默认配置文件。
- file:./config/
- file:./
- classpath:/config/
- classpath:/
以上按照优先级从高到低排序,所有位置的配置文件都会被加载,高优先级的配置文件内容会覆盖低优先级。
也可以通过配置 spring.config.location 来改变默认配置。如果一些配置高优先级没有,而低优先级有,则此配置依然会生效。
3.7 自动配置原理
[配置文件能配置的属性] https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#common-application-properties
- SpringBoot启动时加载大量自动配置类。
- 我们看我们需要的功能有没有SpringBoot写好的自动配置类。
- 再来看这个自动配置类中到底配置了那些组件。
- 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。这样就可以在配置文件中指定这些属性的值。
@Conditional派生注解:必须是@Conditional指定的条件成立,才给容器中添加组件,配置内容才生效。
通过设置debug=true
属性来让控制台打印自动控制报告。