一、配置文件分类
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(.yaml)进行配置。
在同一级别下配置文件的优先级为:properties -> yml -> yaml
二、yaml基本语法
YAML全称是 YAML Ain't Markup Language 。YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++,Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。YAML文件的扩展名可以使用.yml或者.yaml。
YAML的基本语法
- 大小写敏感
- 数据值前边必须有空格,作为分隔符
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混乱)。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- # 表示注释,从这个字符一直到行尾,都会被解析器忽略。
三、yaml的数据格式
对象(map):键值对的集合。
person: name: zhangsan # 行内写法 person: {name: zhangsan}
数组:一组按次序排列的值
address: - beijing - shanghai # 行内写法 address: [beijing,shanghai]
量:单个的、不可再分的值
msg1: 'hello \n world' # 单引忽略转义字符 msg2: "hello \n world" # 双引识别转义字符
YAML:参数引用
name: lisi person: name: ${name} # 引用上边定义的name值
四、获取配置内容
1) @Value
2) Environment
3) @ConfigurationProperties
1.@Value
//普通字符串 @Value("${name}") private String name; //对象 @Value("${person.name}") private String name2; @Value("${person.age}") private int age; //数组 @Value("${address[0]}") private String address1;
2. Environment
@Autowired private Environment env; @RequestMapping("/hello2") public String hello2() { System.out.println("----------------------"); System.out.println(env.getProperty("person.name")); System.out.println(env.getProperty("address[0]")); System.out.println("-------------------"); return "hello Spring Boot 222!"; }
3. @ConfigurationProperties
package com.itheima.springbootinit; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "person") public class Person { private String name; private int age; private String[] address; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String[] getAddress() { return address; } public void setAddress(String[] address) { this.address = address; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
@RequestMapping("/hello2") public String hello2() { System.out.println(person); String[] address = person.getAddress(); for (String s : address) { System.out.println(s); } return "hello Spring Boot 222!"; }
五、profile (不同配置环境场景自动切换)
我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。
- profile配置方式
- 多profile文件方式
- yml多文档方式
- profile激活方式
- 配置文件
- 虚拟机参数
- 命令行参数
1.profile配置方式
- 多profile文件方式
创建多个配置文件,并在主文件配置启动选择哪个配置文件
- yml多文档方式(以弃用)
创建一个application.yml配置文档
--- server: port: 8081 spring: profiles: dev --- #以3个-号分割配置 server: port: 8082 spring: profiles: pro #命名配置名称 --- server: port: 8083 spring: profiles: test --- spring: profiles: active: dev #选择调用哪个配置
2.profile激活方式
- 配置文件
以上的启动文件设置的就是配置文件方式:spring.profiles.active=dev
- 虚拟机参数
Idea中选择Edit Configurantions
选择你的项目启动文件,在VM options中加入:-Dspring.profiles.active=dev
或者
Idea中选择Edit Configurantions
选择你的项目启动文件,在Program arguments中加入:--spring.profiles.active=dev
- 命令行参数
命令行参数:java –jar xxx.jar --spring.profiles.active=dev
六、项目配置加载顺序
内部配置加载顺序
Springboot程序启动时,会从以下位置加载配置文件:
- file:./config/:当前项目下的/config目录下
- file:./ :当前项目的根目录
- classpath:/config/:classpath的/config目录
- classpath:/ :classpath的根目录
加载顺序为上文的排列顺序,高优先级配置的属性会生效
内部配置加载顺序
通过官网查看外部属性加载顺序:
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
文章评论