SpringBoot配置详解
简述
springboot是基于约定的,所以很多配置都有默认的值,但如果想用自己的配置替换掉默认的配置的话,就可以使用application.properties或application.yml进行配置
YAML简介
YAML是YAML Ain't Markup Language的缩写。YAML是一种直观的能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互,可以被支持YAML库的不同的编程语言导入。YAML是以数据为核心的,比传统的xml方式更加简洁。
配置文件的加载顺序
yml和properties的区别
properties文件和我们平常写的是一样的,就是键值对
一般我们不在等号左右加空格,以免被识别成字符串的时候把空格包进去
server.port=8080
而yml的写法略有不同,需要注意的是子属性有缩进,且值前面有空格
server:
port: 8080
YAML基本语法
大小写敏感
数据值前边必须有空格,作为分隔符
使用缩进表示关系
缩进时不允许使用tab,只允许使用空格
缩进的空格数不重要,只要相同层级的元素左对齐即可
#表示注释,从#到行尾,都会被解析器忽略
查看配置
当我们想修改某一配置但又不知道怎么写的时候,可以在idea里双击shift
然后搜索spring-configuration-metadata.json文件,该文件描述了所有的配置书写的格式
注意是这个autoconfigure文件
像服务器启动的端口配置项,我们可以看到配置文件该如何书写
YML数据格式
读取配置文件内容
一共有三种方式来读取我们的配置文件内容:
@Value注解
这也是spring框架支持的解析方式,我们可以在需要注入的变量的上方加value注解,注解值支持spel表达式,写上"${properties的键名}"即可获取到对应的值
Environment方式
我们可以在类中定义一个Environment类型的变量,通过Autowired注解在spring容器初始化好这个变量。
我们就可以用它的getProperty("properties的键名")方法获取到value值
例如我们现在配置了端口
server:
port: 8080
然后我们就可以通过enviroment对象获取这个配置值
@RestController public class ConfigController { private Environment env; @Autowired public ConfigController(Environment env) { this.env = env; } @GetMapping("/port") public Integer getPort(){ return env.getProperty("server.port",Integer.class); } }
ConfigurationProperties注解
我们在实体类上方使用ConfigurationProperties注解,意思就是这个类和配置文件相映射
注解的值就是配置文件里的父级键名,我们写person就意味这要在配置文件里找person前缀的值,并把值注入person对象
当spring将person类加入核心容器时就会自动将配置文件里的值进行注入
为不同环境配置不同配置文件
开发、测试、生产环境所用的配置文件不同,启动的时候可以通过idea或者命令行参数指定不同配置文件
最常用的是使用单一配置文件,用"---"将文件分割成不同区域用于不同环境的配置
每一个区域指定一个生产环境名
spring:
config:
activate:
on-profile: dev
server:
port: 8080
---
spring:
config:
activate:
on-profile: qa
server:
port: 8081
---
spring:
config:
activate:
on-profile: online
server:
port: 8082
像这里我们为三个不同环境指定了不同的端口号
在idea启动的时候我们可以配置profiles的参数指定不同的环境