一.配置文件的相关概念.
- 配置文件主要用于配置应用程序的行为和属性. Spring Boot的配置文件提供了一种灵活且强大的方式,用于管理应用程序的配置信息。
- 很多项目或框架的配置信息也放在配置文件中: 
  - 项目的启动端口.
- 数据库的连接信息(用户名/密码/驱动等的信息).
- 第三方系统的调用密钥等信息.
- 用于发现和定位问题的普通日志和异常日志等.
 
- Spring Boot配置文件的格式有三种: 
  - application.properties
- application.yml.
- application.yaml.
 
注
- yml为yaml的简写,在实际开发的过程中出现的频率最高.
- 当应用程序启动时, Spring Boot会自动从classpath路径找到并加载application.properties 和 application.yaml 或者 application.yml 文件.
- 理论上讲== .properties 和 .yml 可以并存在于一个项目中==,但在实际的业务当中,我们通常会采取一种统一的配置文件格式,这样可以更好的维护. 当 .properties 和 .yml并存时,两个配置都会加载. 如果配置文件内容有冲突, 则以 .properties 为主, 也就是.properties 优先级更高.
二.properties配置文件说明
1.properties基本语法
- properties配置文件是以键值的形式配置的,key 和 value 之间是以"="连接的.
- 举个例子来说明properties配置文件如何写的:
# 配置项⽬端⼝号
server.port=8080
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?
characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=120348
- properties的缺点:properties的配置文件中会有很多的冗余的信息.
  
2.读取properties配置文件的数据.
- 如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。@Value 注解使用" ${} "的格式读取,
- 配置文件代码: mykey.key1=zhangsan
- 测试代码:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PropertiesController {
 @Value("${mykey.key1}")
 private String key1;
 @RequestMapping("/key")
 public String key(){
 return "读取到值:"+key1;
 }
}
运行结果:
 
三.yml配置文件说明.
1.yml的基本语法
-  它的全称 Yet Another Markup Language 翻译成中文就是"另一种标记语言". 
-  yml 是树形结构的配置文件,它的基础语法是"key: value". key 和 value 之间使用英文冒号加空格的方式组成.空格不能省略. 
  
-  第一项的配置为正确的,key 也是高亮蓝色显示的. 第⼆项没有空格是错误的使用方式,第二项的 key 没有高亮显示,该种配置的方式不会生效. 
-  使用yml配置文件连接数据库. 
spring:
	datasource:
		url: jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8&useSSL=false
		username: root
		password: root
2.读取yml配置文件的数据.
1.使用@Value读取yml配置文件的数据
读取基本数据类型以及null
package com.tuanzi.ssm.springhome01.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
    @Value("${string.value}")
    private String value;
    @RequestMapping("/getValue")
    public String getValue() {
        return "读取到值"+value;
    }
}

注意事项:value 值加单双引号
字符串默认不用加上单引号或者双引号,如果加英文的单双引号可以表示特殊的含义。
配置如下信息:
string:
  str1: Hello \n Spring Boot.
  str2: 'Hello \n Spring Boot.'
  str3: "Hello \n Spring Boot."
运行结果:
 
- 从上述结果可以看出: 
  - 字符串默认不用加上单引号或者双引号。
- 单引号会转义特殊字符,使其失去特殊功能, 始终是一个普通的字符串.
- 双引号不会转义字符串里面的特殊字符, 特殊字符会表示本身的含义.
- 此处的转义理解起来会有些拗口, \n 本意表示的是换行, 使用单引号会转义, 就是说, \n 不再表示换航了, 而是表示一个普通的字符串. 使用双引号不会转义, 表示 \n 表示的是它本身的含义, 就是换行
 
2.使用@ConfigurationProperties读取yml配置文件的数据
读取的是一个对象.
- 在yml配置文件中配置如下信息:
student:
  id: 1
  name: java
  age: 18
@ConfigurationProperties(prefix = "student")
@Data
@Component
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    
}
@RestController
public class StudentController {
    @Autowired
    private Student student;
    @RequestMapping("/readStudent")
    public String readStudent() {
        return student.toString();
    }
}
运行结果
 
读取的是一个集合
- 在yml配置文件中配置如下信息:
dbtypes:
  name:
    - mysql
    - sqlserver
    - db2
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
 	private List<String> name;
}
@RestController
public class ReadYml2 {
 	@Autowired
 	private ListConfig listConfig;
 	@RequestMapping("/readList")
 	public String readList(){
 	return listConfig.toString();
 	}
 }
运行结果:
 
读取的是一个Map
- 在yml配置文件中配置如下信息:
maptypes:
 map:
 	k1: kk1
 	k2: kk2
 	k3: kk3
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
 	private HashMap<String,String> map;
}
@RestController
public class ReadYml3 {
 	@Autowired
 	private MapConfig mapConfig;
 	@RequestMapping("/readMap")
 	public String readStudent(){
 	return mapConfig.toString();
 	}
 }
运行结果:
 
3.yml的优缺点
优点:
- 可读性高,写法简单, 易于理解
- 支持更多的数据类型, 可以简单表达对象, 数组, List,Map等数据形态.
- 支持更多的编程语言, 不止是Java中可以使用, 在Golang, Python, Ruby, JavaScript中也可以使用.
缺点:
- 对格式有较强的要求.
- 不适合写复杂的配置文件
- 比如properties格式如下
keycloak.realm = demo
keycloak.resource = fm-cache-cloud
keycloak.credentials.secret = d4589683-Oce7-4982
keycloak.security[0].authRoles[0]= user
keycloak.security[0].collections[0].name = ssolog nur
keycloak.security[0].collections[0].patterns[0] = /login/*
- 转换为yml
keycloak:
 realm: demo
 resource: fm-cache-cloud
 credentials:
 secret: d4589683-Oce7-4982-bcd3
 security:
 - authRoles:
 - user
 collections:
 - name: ssologinurl
   pattern:
     - /login/* 


















