文章目录
- 🍀配置文件的作用
- 🌴SpringBoot配置文件
- 🍃配置文件的格式
- 🌳properties 配置文件说明
- 🌸properties基本语法
- 🌸读取配置文件
- 🌸properties 缺点分析
- 🌲yml 配置文件说明
- 🌸yml 基本语法
- 🌸yml 使用进阶
- 🌻yml 配置不同数据类型及 null
- 🌻配置对象
- 🌻配置集合
- 🌻配置Map
- 🌸yml优缺点
- ⭕总结
🍀配置文件的作用
计算机上有数以千计的配置⽂件, 我们使⽤的绝⼤多数软件, ⽐如浏览器, 微信, Idea, 甚⾄电脑, ⼿机, 都离不开配置⽂件.
我们可能永远不会直接与其中的⼤部分⽂件打交道,但它们确实以不同的形式散落在
我们的计算机上, ⽐如C:\Users, C:\Windows⽂件夹, 以及各种 *.config, *.xml ⽂件
配置⽂件主要是为了解决硬编码带来的问题, 把可能会发⽣改变的信息, 放在⼀个集中的地⽅, 当我们启动某个程序时, 应⽤程序从配置⽂件中读取数据, 并加载运行
硬编码是将数据直接嵌⼊到程序或其他可执⾏对象的源代码中, 也就是我们常说的"代码写死".
比如⼿机字体⼤⼩
如果采⽤硬编码的⽅式, 就直接在程序中指定字体⼤⼩, 所有的⽤⼾使⽤的都是同⼀个字体⼤⼩
但是不同的⽤⼾有不同的偏好, 我们可以把⼿机字体的⼤⼩放在配置⽂件中, 当程序启动时, 读取配
置, 以⽤⼾设置的字体⼤⼩来显示
使用配置⽂件, 可以使程序完成用户和应⽤程序的交互, 或者应⽤程序与其他应⽤程序的交互
🌴SpringBoot配置文件
SpringBoot⽀持并定义了配置⽂件的格式, 也在另⼀个层⾯达到了规范其他框架集成到SpringBoot的
⽬的.
很多项⽬或者框架的配置信息也放在配置⽂件中, ⽐如:
- 项⽬的启动端⼝
- 数据库的连接信息(包含⽤⼾名和密码的设置)
- 第三⽅系统的调⽤密钥等信息
- ⽤于发现和定位问题的普通⽇志和异常⽇志等.
项⽬的启动端⼝
SpringBoot内置了Tomcat服务器, 默认端⼝号是8080, 但是⽤⼾电脑上8080端⼝号有可能就被其他
应⽤程序占⽤了, 所以SpringBoot需要⽀持让⽤⼾⾃定义端⼝号
数据库连接信息
为了更⽅便简单的访问数据库, 出现了⼀些持久层框架, 其实就是对JDBC进⾏了更深层次的封装.让⽤
⼾通过简单⼏⾏代码就可完成数据库的访问. 但是不同的应⽤程序访问的数据库不同, 这些持久层框
架就需要⽀持⽤⼾可以⾃定义配置数据库的连接信息.
我们在前⾯讲了Tocmat 默认端⼝号是8080, 所以我们程序访问时的端⼝号也是8080
但是如果8080端⼝号已经被其他进程使⽤了呢? 我们可以通过配置⽂件来修改服务的端⼝号
SpringBoot 在创建项⽬时, 就已经帮我们创建了配置⽂件
修改 application.properties ⽂件
server.port=9090
显⽰Tomcat启动端⼝号为9090
🍃配置文件的格式
Spring Boot 配置⽂件有以下三种:
- application.properties
- application.yml
- application.yaml
yml 为yaml的简写, 实际开发中出现频率最⾼. yaml 和yml 的使⽤⽅式⼀样, 课堂中只讲yml⽂件的
使⽤
当应⽤程序启动时, Spring Boot会⾃动从classpath路径找到并加载
application.properties 和 application.yaml 或者 application.yml ⽂件.
类似商品的包装⼀样, 有新⽼两款包装. properties 类型的配置⽂件就属于⽼款包装,也是创建
Spring Boot 项⽬时默认的⽂件格式(主要是因为仓库⾥还有库存),⽽ yml 属于新版包装,如果⽤
⼾了解情况直接指定要新款包装,那么就直接发给他
特殊说明
- 理论上讲 .properties 和 .yml 可以并存在于⼀个项⽬中,当 .properties 和 .yml
并存时,两个配置都会加载. 如果配置⽂件内容有冲突, 则以 .properties 为主, 也就是
.properties 优先级更⾼. - 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种
统⼀的配置⽂件格式,这样可以更好的维护(降低故障率)
🌳properties 配置文件说明
properties 配置⽂件是最早期的配置⽂件格式,也是创建 SpringBoot 项⽬默认的配置⽂件
🌸properties基本语法
properties 是以键值的形式配置的,key 和 value 之间是以"="连接的,如:
# 配置项⽬端⼝号
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
🌸读取配置文件
如果在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤ @Value 注解来实现。
@Value 注解使⽤" ${} "的格式读取,如下代码所⽰:
properties 配置如下:
mykey.key1 = bite
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;}
}
🌸properties 缺点分析
properties 配置是以 key-value 的形式配置的,如下图所⽰:
从上述配置key看出,properties 配置⽂件中会有很多的冗余的信息,⽐如这些:
想要解决这个问题,就可以使⽤ yml 配置⽂件的格式化了.
🌲yml 配置文件说明
yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语⾔.
我们先来学习yml的语法
🌸yml 基本语法
yml 是树形结构的配置⽂件,它的基础语法是"key: value".
key 和 value 之间使⽤英⽂冒号加空格的⽅式组成,空格不可省略
基础语法如下:
第⼀项的配置为正确的,key 也是⾼亮显⽰的. 第⼆项没有空格是错误的使⽤⽅式,第⼆项的 key 也
没有⾼亮显⽰
使⽤ yml 连接数据库
spring:datasource:url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=falseusername: rootpassword: root
yml 和 properties 连接数据库的配置对⽐
🌸yml 使用进阶
🌻yml 配置不同数据类型及 null
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
# 浮点数
float.value: 3.14159
# Null,~代表null
null.value: ~
# "" 空字符串
#, 直接后⾯什么都不加就可以了, 但这种⽅式不直观, 更多的表⽰是使⽤引号括起来
empty.value: ''
yml读取配置的⽅式和properties相同,使⽤@Value注解即可,实现代码如下:
@RestController
public class YmlController {@Value("${string.value}")private String say;@RequestMapping("/getSay")public String getSay() {return "say:"+say;}
}
🌻配置对象
我们还可以在yml中配置对象,如下配置:
student:id: 1name: 山顶是一定要去的age: 18
或者是使⽤⾏内写法(与上⾯的写法作⽤⼀致):
student: {id: 1,name: Java,age: 18}
这个时候就不能⽤@Value来读取配置中的对象了,此时要使⽤另⼀个注解
@ConfigurationProperties 来读取,具体实现如下
@ConfigurationProperties(prefix = "studnet")
@Component
@Data
public class Student {private int id;private String name;private int age;
}
这个注解的意思是个读取了配置文件里面的对象
🌻配置集合
配置⽂件也可以配置 list 集合,如下所⽰:
dbtypes:name:- mysql- sqlserver- db2
集合的读取和对象⼀样,也是使⽤ @ConfigurationProperties 来读取的,具体实现如下:
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {private List<String> name;
}
访问集合的实现如下:
@RestController
public class ReadYml2 {@Autowiredprivate ListConfig listConfig;@RequestMapping("/readList")public String readList(){return listConfig.toString();}
}
🌻配置Map
maptypes:map:k1: kk1k2: kk2k3: kk3
或者是使⽤⾏内写法(与上⾯的写法作⽤⼀致):
maptypes: {map: {k1: kk1,k2: kk2, k3: kk3}}
Map的读取和对象⼀样,也是使⽤ @ConfigurationProperties 来读取的,具体实现如下:
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {private HashMap<String,String> map;
}
🌸yml优缺点
优点:
- 可读性⾼,写法简单, 易于理解
- ⽀持更多的数据类型, 可以简单表达对象, 数组, List,Map等数据形态.
- ⽀持更多的编程语⾔, 不⽌是Java中可以使⽤, 在Golang, Python, Ruby, JavaScript中也可以使⽤
缺点:
-
不适合写复杂的配置⽂件
-
对格式有较强的要求(⼀个空格可能会引起⼀场⾎案)
⭕总结
感谢大家的阅读,希望得到大家的批评指正,和大家一起进步,与君共勉!