文章目录
- [SpringBoot 配置文件](#SpringBoot 配置文件)
-
- [(一) 配置文件作用](#(一) 配置文件作用)
- [(二) 配置文件快速入手](#(二) 配置文件快速入手)
- [(三) 配置文件的格式](#(三) 配置文件的格式)
- [(四) properties 配置文件说明](#(四) properties 配置文件说明)
-
- [1. properties 基本语法](#1. properties 基本语法)
- [2. 读取配置文件](#2. 读取配置文件)
- [3. properties 缺点分析](#3. properties 缺点分析)
- [(五) yml 配置文件说明](#(五) yml 配置文件说明)
-
- [1. yml 基本语法](#1. yml 基本语法)
- [2. yml 使用进阶](#2. yml 使用进阶)
-
- 1) yml配置不同数据类型及null yml配置不同数据类型及null)
- 2) yml配置读取 yml配置读取)
- 3.yml配置对象
- [4. 配置集合](#4. 配置集合)
- [5. 配置Map](#5. 配置Map)
- [(六) yml优缺点](#(六) yml优缺点)
SpringBoot 配置文件
(一) 配置文件作用
配置文件主要是为了解决硬编码带来的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行.
硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中,也就是我们常说的"代码写死".
比如手机字体大小
如果采用硬编码的方式,就直接在程序中指定字体大小,所有的用户使用的都是同一个字体大小
但是不同的用户有不同的偏好,我们可以把手机字体的大小放在配置文件中,当程序启动时,读取配置,以用户设置的字体大小来显示.
使用配置文件,可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互
SpringBoot配置文件
SpringBoot支持并定义了配置文件的格式,也在另一个层面达到了规范其他框架集成到SpringBoot的目的.
很多项目或者框架的配置信息也放在配置文件中,比如:
- 项目的启动端口
- 数据库的连接信息(包含用户名和密码的设置)
- 第三方系统的调用密钥等信息
- 用于发现和定位问题的普通日志和异常日志等.
项目的启动端口
SpringBoot内置了Tomcat服务器,默认端口号是8080,但是用户电脑上8080端口号有可能就被其他应用程序占用了,所以SpringBoot需要支持让用户自定义端口号
数据库连接信息为了更方便简单的访问数据库,出现了一些持久层框架,其实就是对JDBC进行了更深层次的封装.让用户通过简单几行代码就可完成数据库的访问.但是不同的应用程序访问的数据库不同,这些持久层框架就需要支持用户可以自定义配置数据库的连接信息.
(二) 配置文件快速入手
我们在前面讲了Tocmat默认端口号是8080,所以我们程序访问时的端口号也是8080
但是如果8080端口号已经被其他进程使用了呢?我们可以通过配置文件来修改服务的端口号
SpringBoot在创建项目时,就已经帮我们创建了配置文件

修改
application.properties文件
server.port=9090


显示Tomcat启动端口号为9090
访问程序: http://127.0.0.1:9090/calc.html

(三) 配置文件的格式
Spring Boot配置文件有以下三种:
- application.properties
- application.yml
- application.yaml
yml为yaml的简写,实际开发中出现频率最高. yaml和yml的使用方式一样,我们只讲yml文件的使用
当应用程序启动时,Spring Boot会自动从classpath路径找到并加载
application.properties 和 application.yaml 或者 application.yml 文件.
也可以通过spring.config.name指定文件路径和名称,参考 链接

特殊说明
- 理论上讲
.properties和.yml可以并存在于一个项目中,当.properties和.yml并存时,两个配置都会加载.如果配置文件内容有冲突,则以.properties为主,也就是.properties优先级更高. - 虽然理论上来讲
.properties可以和.yml共存,但实际的业务当中,我们通常会采取一种统一的配置文件格式,这样可以更好的维护(降低故障率).
(四) properties 配置文件说明
properties 配置文件是最早期的配置文件格式,也是创建 SpringBoot 项目默认的配置文件
1. properties 基本语法
properties 是以键值的形式配置的,key 和 value 之间是以"="连接的,如:
1 # 配置项目端口号
2 server.port=8080
3 #配置数据库连接信息
4 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
5 spring.datasource.username=root
6 spring.datasource.password=root
PS: 小技巧: 配置文件中使用"#"来添加注释信息。
2. 读取配置文件
如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。
@Value 注解使用 "${}" 的格式读取,如下代码所示:
properties配置如下:
1 mykey.key1 = bite

java
1 import org.springframework.beans.factory.annotation.Value;
2 import org.springframework.web.bind.annotation.RequestMapping;
3 import org.springframework.web.bind.annotation.RestController;
4
5 @RestController
6 public class PropertiesController {
7 @Value("${mykey.key1}")
8 private String key1;
9
10 @RequestMapping("/key")
11 public String key(){
12 return "读取到值:"+key1;
13 }
14 }

3. properties 缺点分析
properties 配置是以 key-value 的形式配置的,如下图所示:

从上述配置key看出,properties 配置文件中会有很多的冗余的信息,比如这些:

想要解决这个问题,就可以使用 yml 配置文件的格式化了.
(五) yml 配置文件说明
yml是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中文就是"另一种标记语言.我们先来学习yml的语法
1. yml 基本语法
yml 是树形结构的配置文件,它的基础语法是"key: value".
key 和 value 之间使用英文冒号加空格的方式组成,空格不可省略
基础语法如下:

- 使用 yml 连接数据库
yml 使用示例:
1 spring:
2 datasource:
3 url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
4 username: root
5 password: root
- yml 和 properties 连接数据库的配置对比

2. yml 使用进阶
1) yml配置不同数据类型及null

2) yml配置读取
yml读取配置的方式和 properties相同,使用@Value 注解即可
- yml配置
java
String:
hello: chaoxinxin
@RestController
public class ReadYml {
@Value("${string.hello}")
private String hello;
@RequestMapping("/ymlKey")
public String key(){
return "读取到值:" + hello;
}
}

- 注意事项:value 值加单引号
字符串默认不用加上单引号或者双引号,如果加英文的单双引号可以表示特殊的含义
尝试在application.yml 中配置
java
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
@RestController
public class ReadYml2 {
@Value("${string.str1}")
private String str1;
@Value("${string.str2}")
private String str2;
@Value("${string.str3}")
private String str3;
@RequestMapping("/yml")
public String readYml(){
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
return "yml";
}
}

从上述结果可以看出:
- 字符串默认不用加上单引号或者双引号。
- 单引号会转义特殊字符 ,使其失去特殊功能,始终是一个普通的字符串.
- 双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义.
3.yml配置对象

这个时候就不能用 @Value来读取配置中的对象了,此时要使用另一个注解@ConfigurationProperties来读取
- 配置类
java
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
private int id;
private String name;
private int age;
}
- 调用类
java
@RestController
public class StudentController {
@Autowired
private Student student;
@RequestMapping("/readStudent")
public String readStudent(){
return student.toString();
}
}
- 结果为

4. 配置集合
配置文件 也可以配置list集合
java
dbtypes:
name:
- mysql
- sqlserver
- db2
集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取,实现如下:
java
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
private List<String> name;
}
访问集合的实现如下:
java
@RestController
public class ReadYml3 {
@Autowired
private ListConfig listConfig;
@RequestMapping("/readList")
public String readList(){
return listConfig.toString();
}
}
运行结果:

5. 配置Map

Map的读取和对象一样,也是使用 @ConfigurationProperties 来读取,实现如下:
- 配置类
java
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
private HashMap<String,String> map;
}
- 打印类
java
@RestController
public class ReadYml4 {
@Autowired
private MapConfig mapConfig;
@RequestMapping("/readMap")
public String readStudent(){
return mapConfig.toString();
}
}
- 运行结果:

(六) yml优缺点
优点
-
- 可读性高,写法简单,易于理解
-
- 支持更多的数据类型,可以简单表达对象,数组,List,Map等数据形态.
-
- 支持更多的编程语言,不止是Java中可以使用,在Golang, Python, Ruby, JavaScript中也可以使用
缺点
-
- 不适合写复杂的配置文件
比如properties格式如下
1 keycloak.realm = demo
2 keycloak.resource = fm-cache-cloud
3 keycloak.credentials.secret = d4589683-0ce7-4982-bcd3
4 keycloak.security[0].authRoles[0]= user
5 keycloak.security[0].collections[0].name = ssologinurl
6 keycloak.security[0].collections[0].patterns[0] = /login/*
7 - 不适合写复杂的配置文件
转换为yml
1 keycloak:
2 realm: demo
3 resource: fm-cache-cloud
4 credentials:
5 secret: d4589683-0ce7-4982-bcd3
6 security:
7 - authRoles:
8 - user
9 collections:
10 - name: ssologinurl
11 patterns:
12 - /login/*
转换的过程也比较花费精力,如果配置更复杂一点,可读性会更差,代码也会更难写
- 2.对格式有较强的要求(一个空格可能会引起一场血案)