SpringBoot配置文件
   
    
    
    1、配置文件
   
    
     SpringBoot使用一个全局配置文件,这个文件的文件名是固定的,存放于src/main/resources目录或者类路径/config下
    
   
- application.properties
- application.yml
配置文件的作用:配置文件可以修改一些SpringBoot自动配置的默认配置信息。
    
    
    2、YAML语法
   
以配置端口号为例,看看.yml文件和.xml文件的配置格式
.yml:
server:
  port: 8081
.xml:
<servler>
    <port>8081</port>
</servler>
YAML以数据为中心,比xml,json等更适合做配置文件
    
    
    2.1、YAML基本语法
   
    key:(空格)value:表示一组键值对,
    
     空格必须要有
    
   
    
     以空格的缩进来控制层级关系,只要是左对齐的一列数据,就是同一层级的数据。缩进时,不允许使用Tab键,只允许使用空格
    
   
server:
  port: 8081
  path: /hello
# port和path是同一层级
属性和值也是大小写敏感的!
    
    
    2.2、值的写法
   
YAML支持的三种数据结构:字面量(单个的,不可再分的值),数组(一组按次序排列的值),对象(键值对的集合)
    
    
    2.2.1、字面量:普通的值(数字,字符串,布尔值)
   
- 一般都是通过key: value来写的
- 字符串默认不用加上单引号或者双引号
“”双引号:字符串中的特殊转义字符会转义,比如“A \n B”,输出:A (换行) B
”单引号:字符串中的特殊转移字符不会转移,比如‘A \n B’,输出:A \n B
    
    
    2.2.2、数组(List,Set)
   
用- 表示数组中的一个元素
hobby:
  - basketball
  - playGames
  - football
行内写法:
hobby: [basketball,palyGames,football]
    
    
    2.2.3、对象、Map(键值对)
   
map:
  key1: value1
  key2: value2
行内写法:
map: {key1: value1,key2: value2}
    
    
    2.2.4、文档块
   
    使用—分开
    
     
   
    
    
    2.3、配置文件值的注入
   
javabean:
public class Person {
    private String name;
    private int age;
    private String sex;
    private Date birthday;
    private Pet pet;
    private List hobby;
    private Map<String,Object> map;
// get、set、toString方法省略
}
.yml配置文件:
person:  name: "灭霸"  age: 666  sex: 男  birthday: 6666/66/66  pet:    name: "旺财"    age: 6  hobby:    - "打响指"    - "还是打响指"    - "打代码"  map:    key1: value1    key2: value2
    配置文件写好之后,怎么把配置文件的值注入进去呢?我们可以使用这个注解:
    
     @ConfigurationProperties,但是前提是,这个类需要是Spring容器中的组件,只有这个类注入到容器中,成为Spring容器的组件,才能使用容器提供的@ConfigurationProperties功能
    
    。
   
@Component@ConfigurationProperties(prefix = "person")public class Person {...}
    @ConfigurationProperties(prefix = “person”):告诉Springboot将本类中的属性与配置文件中的相关配置进行绑定。
    
     prefix = “person”:指明需要跟配置文件中哪个(person)下面的所有属性进行一 一映射
    
    。
   
    
    
    2.3.1、properties文件在idea中默认utf-8可能会出现乱码
   
    可以进行以下设置:
    
     
   
    
    
    2.3.2、@value获取值与@ConfigutationProperties获取值
   
    
     @value和@ConfigutationProperties都可以实现配置文件值得注入
    
   
    如果不使用@ConfigutationProperties,我们可以在属性上添加@Value来注入配置文件中的值,但是
    
     每次只能注入一个
    
   
@Value("${person.name}")
private String name;
@Value("#{5*5}")
private int age;
用#{表达式}也可以注入值,不用根据配置文件。
- 区别:
| @ConfigutationProperties | @value | |
|---|---|---|
| 功能 | 批量注入配置文件中的值 | 一个一个地注入 | 
| 松散绑定(松散语法) | 支持 | 不支持 | 
| SpEL | 不支持 | 支持 | 
| JSR303数据校验 | 支持 | 不支持 | 
| 复杂类型封装 | 支持 | 不支持 | 
- 
     .yml配置文件和.properties配置文件都能获取到值。
- 如果只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
- 如果是需要获取配置文件中的多个值或者专门写一个JavaBean来和配置文件进行映射,使用@ConfigurationProperties
 
- 使用JSR303数据校验,@Validated
- @Value(”${(无法支持复杂类型,如map)}“),@Value获取不到配置文件中对应的map属性的值
    
    
    2.3.3、@PropertySource和@ImprotResource和@Bean
   
    @PropertySource:
    
     加载指定的配置文件。只能用于读取.properties配置文件
    
   
# 文件名person.properties
person.name="钢铁侠"
person.age=23
加载配置文件,在需要注入的类上标注@PropertySource
Person类:
@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value = {"classpath:person.properties"})
public class Person {...}
即可记载指定的.properties配置文件。
 
