1,啥是配置文件
大家应该都听过配置文件,它是为了解决硬编码问题的,把可能会修改的信息统一集中放到一个地方,重启程序时,直接在配置文件中读取,啥是硬编码,就是可能会需要修改的地方,比如数据库密码呀,字体大小呀等等,如果我们在代码中写死了,就叫做硬编码,有同学可能会有疑问了,我们自己去需修改代码再重启,跟修改配置文件,再重启有啥区别呢,仅仅是为了方便修改吗,还有两个好处,一个就是与代码分离,我们也不能把数据库密码啥的直接写代码上呀,到时候提交gitee不都知道了,还有一个区别就是,虽然都是重启程序,但是如果改代码,涉及打包,部署,可能改一次要几小时的时间,但是修改配置再启动只要秒级;
2,配置文件快速入手
打开Idea,

这个application.properties就是配置文件; 我们Spring启动的默认端口号是8080,我们来给他改成9090,先体验一下,

是可以正常访问的,我们来试试修改,

重新启动程序,再来访问刚才的接口,

代码运行时候已经告诉了,

访问不到了,修改成9090,

现在就能访问到了;
3,配置文件的格式
配饰文件有三种格式
1,application.properties
2,application.yml
3,application.yaml
这里yaml和yml是一样的,所以我们就讲yml,
properties和yml是可以共存的,并且properties的优先级是大于yml的,就是说,当properties和yml冲突了优先使用properties,我们最好还是使用统一的格式;
4,properties
早期配置文件格式
1,语法
以键值对形式,用=分隔key和Value,key的层级用.来分隔,
比如配置端口号和数据库信息,
java
配置项⽬端⼝号
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=root
我们用#注释配置文件嗷;
2,读取
读取配置文件使用@value("")来注解来实现,并且括号中使用${}来读取参数,
我们来自定义配置,

自己随便定义就行,

来运行程序并访问,

3,缺点
大家现在都更喜欢使用yml,properties格式太冗余了,并且观感也不太好;
5,yml
1,语法
树形结构配置文件,key: value,重点最后: value这个:后面有一个空格。
空格不可省略;
我们来看看
java
spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
username: root
password: root
一层一层都要分两个空格,同级的就不用空格分隔了;
2,配置不同的数据类型
java
#字符串
string:
value: 你好
#布尔
boolean:
value: true
value2: false
#整数
int:
value: 12
#浮点数
float:
value: 2.3
#空null不能直接用,这个字符有意义
null1:
value: null
#空串,啥都不用加,可以加''区分一下
empty:
value: ''
3,配置读取
读取配置文件的方式跟properties是一样的使用@value注解('${要读取的配置文件}')。
我们试试刚才那个int.value读取12;
java
@Value("${int.value}")
private Integer b;
@RequestMapping("get3")
public String get3(){
return "获取到的配置文件"+b;
}

4,配置对象
java
@Data
public class User {
private Integer id;
private String name;
private Integer age;
}
先创建一个对象,再写配置;
java
#配置对象
user:
id: 1
name: 张三
age: 18
#行内写法
user2: {id: 1,name: 张三,age: 18}
这个得小写嗷,就算写了大写,Spring配置文件的机制也会自动把User转换成user,
这个时候就不能使用@value注解了,
我们要使用@ConfigurationProperties注解来读取,具体使用方法呢,就是
@ConfigurationProperties(prefix = "配置文件的类名(不叫这玩意大家理解就好)")
java
@ConfigurationProperties(prefix = "user")
@Configuration
@Data
public class User {
private Integer id;
private String name;
private Integer age;
}
根据配置文件创建在把User交给Spring管理,
java
@Autowired
private User user;
@RequestMapping("get4")
public String get4(){
return user.toString();
}
来看看运行结果:
成功获取嗷;
5,配置集合
java
@ConfigurationProperties("name")
@Component
@Data
public class ListConfig {
private List<Integer> list;
}
我们配置文件中的name和list都要对应上,
java
#配置集合
name:
list:
- 1
- 2
- 4
- 6
- 78
java
@Autowired
private ListConfig listConfig;
@RequestMapping("get5")
public String get5(){
return listConfig.toString();
}
来看看运行结果:

6,配置Map
java
@ConfigurationProperties(prefix = "maptypes")
@Configuration
@Data
public class MapConfig {
private Map<String,Integer> map;
}
java
maptypes:
map:
k1: 124124
k2: 2141
k3: 23523
java
@Autowired
private MapConfig mapConfig;
@RequestMapping("get6")
public String get6(){
return mapConfig.toString();
}

7,yml优缺点
优点:
1,简便,可读性高,简洁,易于理解
2,支持更多的类型比如数组,map,对象
3,支持更多的编程语言,其他语言也能用
缺点:
1,格式要求严格,缺个空格就错了
2,对于复杂的配置可能太长了