一、YAML用法
1、简介
springboot默认有两种配置文件
- application.properties
- application.yml(建议使用)
文件名固定,存放在classpath:/或classpath:/config/目录下
可以通过配置文件修改springboot的默认配置
例如 server.servlet.context-path=/springboot 设置访问路径server.servlet.context-path详细用法
注:springboot2.0中部分配置与springboot1.0中不同,有的被重命名或删除
2、YAML用法
YAML不是一种标记语言,是专门来写配置文件的语言,以数据为中心,简洁和强大,比xml、properties等更适合配置文件的编写
YAML文件的后缀名为.yml或.yaml
两者比较
-
yaml
-
properties
YAML语法规则
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许
- 使用Tab键进行缩进,只能使用空格(IDEA中Tab默认为四个空格)
- 缩进的空格数目不重要,重要的是相同层级的元素左侧要对齐
- ’ # '表示注释
server:
port: 8081 # 写法 key: value,冒号后面必须有空格
servlet:
context-path: /springboot
基本用法
YAML支持的数据结构有三种:
- 字面量:单个的,不可再分的值
- 对象:键值对的集合
- 数组:一组按次序排列的值
三种数据结构的用法:
- 字面量:普通的值,如数字、字符串、布尔值
number: 12.5
str: hello
name: 'tom cruise' #如果字符串包含空格或特殊字符,则必须使用引号引起来,单引号双引号都可以,但有区别
name1: "tom \n cruise" #会对特殊字符进行转义,会被作为普通字符输出,结果为:tom \n cruise
name2: 'tom \n cruise' #不会对特殊字符进行转义,结果为:tom 换行 cruise
- 对象:也称为映射Map,包含属性和值
#写法1:换行写
user:
name: tom
age: 20
sex: male
#写法2:行内写法
user: {name: tom,age: 20,sex: male}
- 数组:如List、Set等
#写法1:一组短横线开头的行
names:
- tom
- jack
- alice
#写法2:行内写法
name: [tom,jack,alice]
二、为属性注入值
通过加载配置文件,为类中的属性注入值
使用.yml配置文件
创建一个JavaBean对象(User类)
application.yml文件,将要绑定的值
由于启动SpringBoot时已经加载了applic.yml配置文件,只需要将值绑定过去就好
方法:使用@ConfigurationProperties注解,同时把当前类添加到容器中
@ConfigurationProperties作用:默认读取全局配置文件获取值,将当前类中所有属性与配置文件中的user进行绑定
我们还可以在pom.xml文件中添加依赖方便编写.yml文件
使用properties配置文件
application.properties文件
注:IDEA中properties文件默认使用UTF-8/GBK编码,会出现中文的乱码
解决办法:
重要:如果同时存在application.yml和application.properties同时存在且配置冲突,优先使用application.properties中的配置(application.properties优先级更高)
使用@Value为属性注入值
@Value和@ConfigurationProperties的比较
- @Value只能一个个为属性注入值,而@ConfigurationProperties可以批量为属性注入值
- @Value不支持为复杂类型封装,而@ConfigurationProperties支持
三、多环境配置
可以为不同环境提供不同的配置信息,如开发环境、测试环境、生产环境等
两种方式:
- 创建多个properties文件
- 步骤:
1、创建不同环境的properties文件
文件命名必须符合application-xxx.properties格式,例如:
application-dev.properties
application-test.properties
application-prod.properties
2、在application.properties文件中指定要激活的配置
#application.properties文件中指定要激活的配置文件
spring.profiles.active=dev #激活application-dev.properties文件
- 定义yml文档块
- 在yml文件中使用三个短横线(- - -)定义多个文档块
步骤:
1、在yml文件中定义多个文档块,表示不同的环境配置
2、在第一个文档块中指定要激活的配置
server:
port: 8080
spring:
profiles:
active: dev #激活dev环境
---
spring:
profiles: dev #配置环境名称
server:
port: 8081
---
spring:
profiles: test
server:
port: 8082
---
spring:
profiles: prod
server:
port: 8083
四、加载外部配置文件
加载properties属性文件
问题:@ConfigurationProperties默认是从全局配置文件中获取值,如果想从外部的自定义属性文件中获取值怎么办?
解决:使用@PropertySource加载外部的属性文件(可以加载多个外部的属性文件)
加载spring配置文件或xml文件
问题:如果确实需要将配置写在Spring的配置文件中,想加载xml文件怎么办?
解决:主配置类中使用@ImportResource加载外部的Spring配置文件
注:SpringBoot中不建议使用加载xml文件
使用注解方式添加组件
推荐使用全注解方式向容器中添加组件,使用@Configuration和@Bean注解
五、自动配置原理
1、执行流程
- SpringBoot启动时加载主配置类,开启了自动配置功能
@EnableAutoConfiguration - @EnableAutoConfiguration作用:
利用@Import({AutoConfigurationImportSelector.class})向容器中添加一些组件(自动配置类)
查看AutoConfigurationImportSelector中的selectImports()方法
查看List< String > configurations = this.getCandidateConfigurations(annotationMetadata, attributes); 获取候选配置
查看SpringFactoriesLoader.loadFactoryNames方法
查看loadSpringFactories()方法
查看classLoader.getResources(“META-INF/spring.factories”)
扫描所有Jar包路径下的META-INF/spring.factories文件并加载,获取EnableAutoConfiguration对应的值(在spring-boot-autoconfigure-2.0.3.RELEASE.jar中)
将这些自动配置类(xxxAutoConfiguration) 添加到容器中 - 通过这些自动配置类来完成响应的自动配置功能
2、原理分析
以HttpEncodingAutoConfiguration为例,就是以前在web.xml文件中配置的CharacterEncodingFilter过滤器
注意:
- 根据当前不同的条件判断,决定自动配置类是否生效,即并不是所有的自动配置类都会生效
- 自动配置类xxxAutoConfiguration的属性是从对应的xxxProperties类中获取的
- xxxProperties类中的所有属性是通过配置文件注入绑定的,我们可以通过配置文件指定这些属性的值
3、总结
- SpringBoot启动时会加载大量的自动配置类
- 通过这些自动配置类向容器中添加组件
- 通过这些组件来自动完成许多功能,简化配置