目录
起步依赖原理分析
配置文件分类
YAML
YAML:基本语法
YAML:数据格式
YAML:参数引用
读取配置内容
profile
Profile-小结
内部配置加载顺序
外部配置加载顺序
-
起步依赖原理分析
- 在spring-boot-starter-parent中定义了各种技术的版本信息,组合了一套最优搭配的技术版本
- 在各种starter中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程
- 我们的工程继承parent,引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并且不会存在版本冲突等问题
-
配置文件分类
- SpringBoot是基于约定的,所以很多配置都有默认值
- 但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)进行配置
- properties:
- server.port=8080
- yml:
- server:
- port:8080
- 小结
- SpringBoot提供了2种配置文件类型:properties和yml/yaml
- 默认配置文件名称:application
- 在同一级目录下优先级为: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
- properties:
- server.port=8080
- server.address=127.0.0.1
- xml:
- <server>
- <port>8080</port>
- <address>127.0.0.1</address>
- </server>
- yml:
- server:
- port:8080
- address:127.0.0.1
- 简洁,以数据为核心
-
YAML:基本语法
- 大小写敏感
- 数据值前边必须有空格,作为分隔符
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数目可能不同,导致层次混乱)
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- #表示注释,从这个字符一直到行尾,都会被解析器忽略
- server:
- port:8080
- address:127.0.0.1
- name:abc
-
YAML:数据格式
- 对象(map):键值对的集合
- person:
- name:zhangsan
- #行内写法
- person: {name: zhangsan}
- 数组:一组按次序排列的值
- address:
- - beijing
- - shanghai
- #行内写法
- address: [beijing,shanghai]
- 纯量:单个的、不可再分的值
- msg1: 'hello \n world' #单引忽略转义字符
- msg2: "hello \n world" #双引识别转义字符
-
YAML:参数引用
- name: list
- person:
- name: ${name} #引用上边定义的name值
-
读取配置内容
- 1.@Value
- 2.Environment
- 3.@ConfigurationProperties
- @Value
-
server: port: 8082 name: abc # 对象 person: name: zhangsan age: 20 address: - beijing - shanghai # 对象行内写法 person2: {name: zhangsan,age: 20} # 数组 address: - beijing - shanghai # 数组行内写法 address2: [beijing,shanghai] # 纯量 msg1: 'hello \n world' # 不会识别转义字符,会原样输出 msg2: "hello \n world" # 会识别转义字符
- Environment
- @ConfigurationProperties
-
@Component @ConfigurationProperties(prefix = "person") public class Person { private String name; private int age; private String[] address; public String[] getAddress() { return address; } public void setAddress(String[] address) { this.address = 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; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", address=" + Arrays.toString(address) + '}'; } }
-
@RestController public class HelloController { @Value("${name}") private String name; @Value("${person.name}") private String name2; @Value("${person.age}") private String age; @Value("${address[0]}") private String address1; @Value("${msg1}") private String msg1; @Value("${msg2}") private String msg2; @Autowired private Environment env; @Autowired private Person person; @RequestMapping("/hello") public String hello(){ System.out.println(name); System.out.println(name2); System.out.println(age); System.out.println(address1); System.out.println(msg1); System.out.println(msg2); System.out.println("-----------------"); System.out.println(env.getProperty("person.name")); System.out.println(env.getProperty("address[0]")); System.out.println("-----------------"); System.out.println(person); String[] address = person.getAddress(); for(String s : address){ System.out.println(s); } return "hello SpringBoot"; } }
-
profile
- 我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境
- 比如:开发、测试、生产等
- 其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦
- profile功能就是来进行动态配置切换的
- (1)profile配置方式
- 多profile文件方式
- yml多文档方式
- (2)profile激活方式
- 配置文件
- 虚拟机参数
- 命令行参数
-
Profile-小结
- (1)profile是用来完成不同环境下,配置动态切换功能的
- (2)profile配置方式
- 多profile文件方式:提供多个配置文件,每个代表一种环境
- application-dev.properties/yml 开发环境
- application-test.properties/yml 测试环境
- application-pro.properties/yml 生产环境
- yml多文档方式:
- 在yml中使用---分隔不同配置
- 多profile文件方式:提供多个配置文件,每个代表一种环境
- (3)profile激活方式
- 配置文件:在配置文件中配置:spring.profiles.active=dev
- 虚拟机参数:在VM options指定:-Dspring.profiles.active=dev
- 命令行参数:java-jar xxx.jar --spring.profiles.active=dev
-
内部配置加载顺序
- Springboot程序启动时,会从以下位置加载配置文件:
- 1.file:./config/:
- 当前项目下的/config目录下
- 2.file:./:
- 当前项目的根目录
- 3.classpath:/config/:
- classpath的/config目录
- 4.classpath:/:
- classpath的根目录
- 加载顺序为上文的排列顺序,高优先级配置的属性会生效
-
外部配置加载顺序
- 以下优先级从高到低,高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
- 1-命令行参数:所有的配置都可以在命令行上进行指定;
- 2-来自java:comp/env的JNDI属性;
- 3-Java系统属性(System.getProperties());
- 4-操作系统环境变量 ;
- 5-jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- 6-jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件 再来加载不带profile
- 7-jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- 8-jar包内部的application.properties或application.yml(不带spring.profile)配置文件
- 9-@Configuration注解类上的@PropertySource
- 根据第7条,我们只要在jar包同目录外放置一个application.properties配置文件,就会起作用,同时这个配置文件的优先级还比jar内的高,这个配置很有作用