一、配置文件
– Spring Boot使用一个全局的配置文件
• application.properties
• application.yml
– 配置文件放在src/main/resources目录或者类路径/config下
– .yml是YAML(YAML Ain't Markup Language)语言的文件,以数据为中 心,比json、xml等更适合做配置文件
• http://www.yaml.org/ 参考语法规范
– 全局配置文件的可以对一些默认配置值进行修改
二、YAML语法
1、YAML基本语法
– 使用缩进表示层级关系
– 缩进时不允许使用Tab键,只允许使用空格。
– 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
– 大小写敏感
2、YAML 支持的三种数据结构
– 对象:键值对的集合
– 数组:一组按次序排列的值
– 字面量:单个的、不可再分的值
YAML常用写法
– 对象(Map)
• 对象的一组键值对,使用冒号分隔。如:username: admin
• 冒号后面跟空格来分开键值;
• {k: v}是行内写法
数组
– 一组连词线(-)开头的行,构成一个数组,[]为行内写法
– 数组,对象可以组合使用
– 复合结构。以上写法的任意组合都是可以
– 字面量
• 数字、字符串、布尔、日期
• 字符串
– 默认不使用引号
– 可以使用单引号或者双引号,单引号会转义特殊字符
– 字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格。
– 文档
• 多个文档用 - - - 隔开
注意: Spring Boot使用 snakeyaml 解析yml文件; https://bitbucket.org/asomov/snakeyaml/wiki/Documentation#markdown-header-yamlsyntax 参考语法
Pets{name='zhangsan \n', username='张三', age=18, pet={name=小狗, gender=male}, animal=[dog, cat, fish], interests=[足球, 篮球], friends=[[zhangsan is my best friend, lisi ]], childs=[{age=18, name=xiaozhang}, {pets={1=b, 0=a}, name=xiaoli}, {age=18, name=lisi}]}
三、配置文件值注入
• @Value和@ConfigurationProperties为属性注值对比
• 属性名匹配规则(Relaxed binding)
– person.firstName:使用标准方式
– person.first-name:大写用
– person.first_name:大写用_
– PERSON_FIRST_NAME:
• 推荐系统属性使用这种写法
• @ConfigurationProperties
– 与@Bean结合为属性赋值
– 与@PropertySource(只能用于properties文件)结合读取指定文件
• @ConfigurationProperties Validation
– 支持JSR303进行配置文件值校验;
• @ImportResource读取外部配置文件
四、配置文件占位符
• RandomValuePropertySource:配置文件中可以使用随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
• 属性配置占位符
– 可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)。
– ${app.name:默认值}来指定找不到属性时的默认值
五、 Profile
Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、 指定参数等方式快速切换环境
1、多profile文件形式:
– 格式:application-{profile}.properties/yml:
• application-dev.properties、application-prod.properties
2、多profile文档块模式:
3、激活方式:
– 命令行 --spring.profiles.active=dev
– 配置文件 spring.profiles.active=dev
– jvm参数 –Dspring.profiles.active=dev
六、配置文件加载位置
• spring boot 启动会扫描以下位置的application.properties或者 application.yml文件作为Spring boot的默认配置文件
– file:./config/
– file:./
– classpath:/config/
– classpath:/
– 以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先 级配置内容会覆盖低优先级配置内容。
– 我们也可以通过配置spring.config.location来改变默认配置
七、外部配置加载顺序
Spring Boot 支持多种外部配置方式
这些方式优先级如下:
1. 命令行参数
2. 来自java:comp/env的JNDI属性
3. Java系统属性(System.getProperties())
4. 操作系统环境变量
5. RandomValuePropertySource配置的random.*属性值
6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10. @Configuration注解类上的@PropertySource
11. 通过SpringApplication.setDefaultProperties指定的默认属性
八、自动配置原理
1、可以查看HttpEncodingAutoConfiguration
2、通用模式
– xxxAutoConfiguration:自动配置类
– xxxProperties:属性配置类
– yml/properties文件中能配置的值就来源于[属性配置类]
3、几个重要注解
– @Bean
– @Conditional
4、--debug=true查看详细的自动配置报告
@Conditional扩展
@Conditional扩展注解 | 作用(判断是否满足当前指定条件) |
@ConditionalOnJava | 容器中存在指定Bean; |
@ConditionalOnMissingBean | 容器中不存在指定Bean; |
@ConditionalOnExpression | 满足SpEL表达式指定 |
@ConditionalOnClass | 系统中有指定的类 |
@ConditionalOnMissingClass | 系统中没有指定的类 |
@ConditionalOnSingleCandidate | 容器中只有一个指定的Bean,或者这个Bean是首选Bean |
@ConditionalOnProperty | 系统中指定的属性是否有指定的值 |
@ConditionalOnResource | 类路径下是否存在指定资源文件 |
@ConditionalOnWebApplication | 当前是web环境 |
@ConditionalOnNotWebApplication | 当前不是web环境 |
@ConditionalOnJndi | JNDI存在指定项 |