目录
一. 配置文件相关概念
配置文件是用于存储各种配置信息和参数设置的文件.
SpringBoot 同样也有配置文件. 其中包含很多信息 如:项目的启动端口; 数据库的连接信息; 第三方系统的调用密钥等信息; 普通日志和异常日志等.
二. 配置文件快速上手
我们在前面讲了Tomcat的默认端口号是8080, 我们程序访问时默认的端口号也是8080. 但是如果8080这个端口号已经被其他进程占用了呢? --> 此时我们就可以通过配置文件来修改服务的端口号.
1. 配置文件的格式
配置文件有以下两种类型:
① application. properties
② application. yml
其中, application.yml 也可以些写作 application.yaml (yml为yaml的简写, 两者语法和使用方式完全相同). 当应⽤程序启动时, Spring Boot 会自动从 classpath 路径找到并加载 application.properties 和 application.yml 文件.
[注]: 理论上讲, properties 和 yml 文件可以并存在一个项目中. 项目启动时, 两个文件内的配置都会加载. 当两者发生冲突时, 以properties为主 (properties的优先级更高).
2. properties 配置文件
(1) properties 基本语法
properties 文件是以键值对的形式进行配置的. 键值对中的 key 和 value 之间用 = 连接.
server.port=8080
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?
characterEncoding=utf8&useSSL=false
spring.datasource.name=root
spring.datasource.password=123456
(2) 读取配置文件内容
如果在项目中,想要主动的读取配置文件中的内容, 可以使用 @Value 注解来实现.
@Value 注解使用" ${ } "的格式读取. 如下代码所示:
properties代码:
mykey.key="master"
Java代码:
@RestController
@RequestMapping("/demo")
public class PropertiesController {
@Value("${mykey.key}")
private String key;
@RequestMapping("/key")
public String key(){
return "读到key值" + key;
}
}
(3) properties 缺点分析
[会出现冗余信息.]
properties 文件是以键值对的形式配置的. 而键难免会出现重复的信息, 这些信息就是冗余的.
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.name=root
spring.datasource.password=123456
如上述代码中, datasource 这部分就是显得非常冗余.
3. yml配置文件
yml 是yaml 的缩写. yaml ("Yet Another Markup Language" -- 意为"另一种标记语言").
(1) yml 基本语法
yml 是树形结构的配置文件. 它的基础语法是 "key: value", key 和 value之间 使用空格加冒号隔开 (空格不可省略).
使用 yml 连接数据库:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8&useSSL=false
username: root
password: 123456
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
# 浮点数
float.value: 3.14159
# Null,~代表null
null.value: ~
# "" 表示空字符串
# 直接在键后面什么都不加也可以, 但这种⽅式不直观, 更常用的表⽰方式是使⽤引号括起来
empty.value: ''
(2) 读取配置文件内容
yml 读取配置文件内容的方式和properties相同, 使用 @Value 注解来实现.
@Value 注解使用" ${ } "的格式读取. 如下代码所示:
yml 代码:
string:
hello: "master"
Java代码:
@RestController
@RequestMapping("/demo")
public class YmlController {
@Value("${string.hello}")
public String hello;
@RequestMapping("/hello")
public String hello(){
return "读取到值" + hello;
}
}
[注意]:
字符串默认不用加上单引号或者双引号, 如果加单双引号会表示特殊的含义.
- 默认不加单双引号.
- 加单引号: 特殊字符失去特殊含义, 始终是一个普通字符串.
- 加双引号: 特殊字符表示其特殊含义.
yml 代码:
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
Java代码:
@RestController
public class ReadYml {
@Value("${string.str1}")
private String str1;
@Value("${string.str2}")
private String str2;
@Value("${string.str3}")
private String str3;
@PostConstruct
public String readYml(){
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
return "yml";
}
}
上述程序执行结果如下图所示:
(3) yml 配置对象
用yml文件也可以配置对象:
① 一般格式:
student:
id: 1
name: java
age: 20
② 行内格式:
student: {id: 1,name: Java,age: 18}
注意此时就不能使用 @value 获取配置了, 需要用 @ConfigurationProperties 来读取对象.
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
}
@RestController
public class StudentController {
@Autowired
private Student student;
@RequestMapping("/readStudent")
public void readStudent(){
System.out.println(student);
}
}
运行结果如下:
(4) yml 配置集合
dbtypes:
name:
- mysql
- sqlserver
- db2
读取集合的方式和读取对象的方式相同: 用 @ConfigurationProperties 来读取集合.
@ConfigurationProperties("dbtypes")
@Component
@Data
public class ListConfig {
private List<String> name;
}
@RestController
public class ReadYml2 {
@Autowired
private ListConfig listConfig;
@RequestMapping("/readList")
public String readList(){
return listConfig.toString();
}
}
(5) yml 配置map
maptypes:
map:
k1: v1
k2: v2
k3: v3
读取map的方式和读取对象的方式相同: 用 @ConfigurationProperties 来读取map.
@ConfigurationProperties(prefix = "maptypes")
@Component
@Data
public class MapConfig {
public Map<String,String> map;
}
@RestController
public class ReadYml2 {
@Autowired
public MapConfig mapConfig;
@RequestMapping("/readMap")
public void readStudent(){
return mapConfig.toString();
}
}
(6) yml 优缺点
① yml 优点:
- 可读性高, 写法简单, 易于理解.
- 支持更多的数据类型, 可以简单表达对象, 数组, List, Map等数据形态.
- 支持更多的编程语言, 不止是在Java中可以使用.
② yml 缺点:
- 不适合写复杂的配置文件. (如果用yml写较复杂的配置文件的话, 可读性就会很差)
- 对格式有较强的要求.