Spring Boot 学习摘要–关于配置
学习教程来自:B站 尚硅谷
1. 关于配置
1. Yaml
键值对写法:必须要有空格!
k: v
v 的一些写法
- v 是对象
1
2
3
4
5
6friends:
name: zhangsan
age: 20
行内写法:
friends: {name: zhangsan, age: 20}- v 是数组
1
2
3
4
5
6pets:
- cat
- dog
行内写法:
pets: [cat,dog]
2. properties 文件
默认编码是 utf-8 编码,在获取其中的中文时可能有问题,需要修改一下设置
在 settings -> File Encodings 中勾选 “Transparent native-to-ascii conversion”
3. 获取配置中的值
@ConfigurationProperties
@ConfigurationProperties(prefix = "?")
告诉 SpringBoot 将本类中的所有属性和篇日志文件中相关的配置进行绑定参数 prefix 指定配置文件中某一个 key 下的所有属性进行一一映射
@Value
@Value
使用 $ 来获取配置中的值,或者使用 # 来实时计算1
2
3
4@Value("${person.last-name}")
private String name;
@Value("#{11*2}")
private int age;
xxx | @ConfigurationProperties | @Value |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 eg:map | 支持 | 不支持 |
- 松散绑定:lastName / last-name / last_name 都可以识别成 lastName
- SpEL:#{11*2} 这种方式
- JSR303数据校验:在类上加入注解
@Validated
,在变量前加入注解比如@Email
,可以自动识别是否符合邮箱格式
如果只是简单获取一下配置的值,就用@Value
4. @PropertySource 和 @ImportResource
- @PropertySource:加载指定的配置文件,在配置类上添加
@PropertySource(value={"classpath:person.properties"})
- @ImportResource:导入指定的配置文件,在启动类上添加
@ImportResource(locations={"classpath:xxx.xml"})
5. 配置文件占位符
1 | #name: zhangsan |
6. 测试、生产多配置文件指定
- 使用 properties 文件,多 profiles 的形式
application.properties: 主配置文件
application-dev.properties: 测试配置文件
application-prod.properties: 生产配置文件
默认启动的时候会激活主配置文件,切换配置文件时,在主配置文件中添加
1 | spring.profiles.active=dev/prod |
- 使用 yml 文件,多文档块的形式
appication.yml 使用 — 三个横线可以在一个文件中添加多个文档块,相当于编写了好几个文档
1 | server: |
7. 配置文件目录
- file:/config/ -> 项目根目录/config/
- file:/ ->项目根目录
- classpath:/config/ -> resources/config/
- classpath:/ -> resources
优先级由高到低;相同配置项以高优先级的配置为主;互补配置(会全部加载)
8. 自动配置原理
Spring Boot 启动时加载主配置类,开启自动配置功能 @EnableAutoConfiguration
@EnableAutoConfiguration
的作用:
利用
AutoConfigurationImportSelector.class
给容器导入一些组件通过
selectImports()
方法来确定哪一些配置被导入
1 | List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes); |
=>
将类路径 META-INF/spring.factories
下配置的所有 EnableAutoConfiguration.class
的值加入到容器中
eg: xxxAutoConfiguration.class
每一个这样的类都是容器中的一个组件,加入到容器后,再用他们来做自动配置
能配置的属性都来源于 xxxAutoConfiguration.class
类对应的 xxxProperties.class
类
在 xxxProperties.class
类前会有很多注解,比如 @ConditionalOnWebApplication
用来判断是否是一个web应用,如果是返回true,下面的内容才生效,等等注解。即自动配置类是需要在一定条件下才能生效
可以通过在 application.properties
文件中添加 debug=true
来打印出自动配置报告,看到哪一类自动配置类启动了哪一些没启动
总结:
- xxxAutoConfiguration:自动配置类,给容器添加组件
- xxxProperties:封装配置文件中相关属性