1. 配置文件
1.1 配置文件的作用
计算机上有数以千计的配置文件,我们使用的绝大多数软件,比如浏览器、微信等,都离不开配置文件。我们可能永远也不会直接与其中的大部分配置文件打交道,但它们确实以不同的形式散落在我们的计算机上,比如 C:\Users,C:\Windows 文件夹,以及各种 *.config,*.xml 文件。
配置文件主要是为了解决硬编码带来的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行。
硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中,即我们常说的把 “代码写死”。
比如手机字体大小采用硬编码的方式,就直接在程序中指定字体大小,所有用户使用的都是同一个字体大小。但是不同的用户有不同的偏好,我们可以把手机字体放在配置文件中,当程序启动时,读取配置,以用户设置的字体大小来显示。
使用配置文件,可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互。
1.2 Spring Boot 配置文件
Spring Boot支持并定义了配置文件的格式,也在另一个层面达到了规范其他框架集成到SpringBoot的目的。
很多项目或者框架的配置信息,也放在配置文件中,例如:
1、项目的启动端口。
2、数据库的连接信息(包含用户名和密码的设置)。
3、第三方系统的调用密钥等信息。
4、用于发现和定位问题的普通日志和异常日志等。
项目的启动端口:Spring Boot内置了Tomcat服务器,默认端口号是8080,但在用户电脑上8080端口号有可能被其他应用程序占用了,所以Spring Boot需要支持让用户自定义端口号。
数据库连接信息:为了更方便、简单的访问数据库,出现了一些持久层框架,其实就是对JDBC进行了更深层次的封装。让用户通过简单的几行代码,就可以完成数据库的访问。但是不同的应用程序访问的数据库不同,这些持久层框架就需要支持用户可以自定义配置数据库的连接信息。
2. 配置文件快速入手
Tocmat默认的端口号是8080,所以我们程序访问时的端口号也是8080,但是如果8080端口号已经被其他进程占用了,这时候我们就可以通过配置文件来修改服务器的端口号,Spring Boot在创建项目时,就已经帮我们创建了配置文件。如图:
使用之前写的图书管理系统举例,当前8080的端口号已经被占用了:
故此在配置文件里修改一下端口号,在application.properties文件中,加上以下代码:
重新运行项目,执行结果如下:
浏览器访问http://127.0.0.1:8101/login.html ,页面与之前类似;
3. 配置文件的格式
Spring Boot配置文件的格式有以下三种:
1、application.properties
2、application.yml
3、application.yaml
其中的 yml 是 yaml 的简写,实际开发中出现频率最高。yaml 和 yml 的使用方式一样,这里就只讲 yml 的使用。
当应用程序启动时,Spring Boot 会自动从 classpath 路径找到并加载 application.properties (application.yaml 或者 application.yml文件)。也可以通过Spring.config.name指定文件路径和名称,参考文档:Core Features (spring.io)
1、application.properties 和 application.yml的关系
类似商品的包装,有新款包装,也有老款包装。properties 类型的配置文件就属于老款包装,也是创建 Spring Boot项目时默认的文件格式(主要是因为仓库里还有库存),而 yml 属于新款包装,如果用户了解情况直接指定要新款包装,那么就直接发给他。2、特殊说明
1)、理论上讲: .properties 和 .yml 可以并存在一个项目中,当 .properties 和 .yml 并存时,两个配置都会加载。如果配置文件内容有冲突,则以 .properties 为主,也就是 .properties 优先级更高。2)、但实际业务中,我们通常采取其中的一种,统一配置文件格式,这样也可以更好的维护(降低故障率)。
4. properties配置文件说明
properties 配置文件是最早期的配置文件格式,也是创建Spring Boot项目默认的配置文件。
4.1 properties 的基本语法
properties 是以键值的形式配置的,key 和 value 之间是以 "=" 连接的,例如下面内展示使用properties连接数据库:
spring.application.name=zxslzw2014_8_11
#配置项目端口号
server.port=8101
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test??characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root001
配置文件中使用 "#" 来添加注释信息,更多配置信息可参考官网:Common Application Properties
4.2 读取配置文件
如果在spring项目中,想要主动读取配置文件中的内容,可以使用@Value注解来实现。@Value注解使用 "${ }" 格式读取,代码如下:
properties配置如下:
PropertiesController类代码如下:
package com.example.zxslzw2014_8_11;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/properties")
@RestController
public class PropertiesController {
@Value("${mykey.key1}")
private String key1;
@RequestMapping("/key")
public String key() {
return "读取搭配值:" + key1;
}
}
浏览器访问http://127.0.0.1:8101/properties/key, 页面如下:
可以看到,通过注解@Value,使用${ }的格式,拿到了配置文件里的内容。
4.3 properties 的缺点分析
我们知道,properties配置是以key-value的形式配置的,如图:
从上图可知,properties配置文件中会有很多冗余信息(红色框框出来的);想要解决这个问题,就可以使用yml配置文件的格式化了。
5. yml配置文件说明
yml是yaml的缩写,它的全称是:Yet Another Markup Language,翻译成中文就是:另一种标记语言。
5.1 yml基本语法
yml是树形结构的配置文件,它的基础语法是 "key: value"。key和value之间使用 英文冒号 + 空格 的方式组成,空格不可省略!
基本语法,代码如下:
#正确的配置方式,冒号后面必须要有空格
key1: java
#错误的配置方式
key2:java2
使用yml连接数据库, 代码如下:
比比较来看,yml省去了很多的冗余信息,而这些冗余信息,properties都要写出来
5.2 yml使用进阶
5.2.1 配置不同数据类型及null
代码如下:
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value1: true
boolean.value2: false
# 整数
int.value: 10
#浮点数
float.value: 3.1415926
# Null,~代表null
null.value: ~
# “” 空字符串
#,直接后面什么都不加就可以了,但这种方式不直观,更多的表示是使用引号括起来
empty.value: ''
这里的 点" . " 使用换行也可以写成下面的形式。字符串的例子代码如下:
# 字符串
string:
value: Hello
5.2.1.1 yml 配置读取
yml配置:
string.hello: hello yml
string:
hello: hello yml
上面这两种写法都可以,但是换行的写法才是yml的风格;
yml 读取配置的方式和 properties 相同,使用 @Value 注解即可,实现代码如下:
@RequestMapping("/yml")
@RestController
public class YmlController {
@Value("${string.hello}")
private String hello;
@RequestMapping("/stringHello")
public String stringHello() {
return "读取到值:" + hello;
}
}
浏览器访问:http://127.0.0.1:8101/yml/stringHello,页面结果如下:
5.2.1.1 value 值加单双引号
字符串默认不用加上单引号或者双引号,加英文的单引号可以表示特殊的含义。application.yml配置信息如下:
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
读取代码如下:
package com.example.zxslzw2014_8_11;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/yml")
@RestController
public class YmlController {
@Value("${string.str1}")
private String str1;
@Value("${string.str2}")
private String str2;
@Value("${string.str3}")
private String str3;
@RequestMapping("/stringHello2")
public String stringHello2() {
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
return "读取到值";
}
}
浏览器访问:http://127.0.0.1:8101/yml/stringHello2,读取到的结果如下:
可以看到,不加引号和加单引号的是原来的字符串内容,而加了双引号的把 \n 变成了换行。
小结:
1、字符串默认不用加上单引号或者双引号。
2、单引号会转义特殊字符,使其失去特殊功能,让字符串保持原来的,始终是一个普通的字符串。
3、双引号不会转义字符串里面的特殊字符,让特殊字符表示它本身的含义。例如上面的例子,就是把 /n 保持它原本的含义,没有对它进行转义,保持字符串原本的内容
5.2.2 配置对象
yml配置信息内容如下:
student:
id: 1
name: shenmengyao
age: 23
或行内写法,形式如下:
student: {id: 1, name: shenmengyao, age: 23}
我们此时要用注解@ConfigurationProperties,这个注解要放在Student类里面,代码如下:(下面的 "perfix = " 可以省略):
package com.example.zxslzw2014_8_11;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
private int id;
private String name;
private int age;
}
调用类代码如下:使用@Autowired注解注入依赖:
package com.example.zxslzw2014_8_11;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/yml")
@RestController
public class YmlController {
@Autowired
private Student student;
@RequestMapping("/readStudent")
public String readStudent() {
return student.toString();
}
}
浏览器访问:http://127.0.0.1:8101/yml/readStudent ,结果如下:
5.2.3 配置集合
配置文件也可以配置list集合,和读取对象一样,使用@ConfigurationProperties来读取,yml配置信息内容如下:
list:
name:
- mysql
- sqlserver
- arraylist
集合的读取和对象读取一样,使用@ConfigurationProperties来读取,具体实现代码如下:
package com.example.zxslzw2014_8_11;
import com.sun.tools.javac.util.List;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "list")
@Component
@Data
public class ListConfig {
private List<String> name;
}
调用类代码实现如下:
package com.example.zxslzw2014_8_11;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/yml")
@RestController
public class YmlController {
@Autowired
private ListConfig listConfig;
@RequestMapping("/readList")
public String readList() {
return listConfig.toString();
}
}
浏览器访问http://127.0.0.1:8101/yml/readList,结果页面如下:
5.2.4 配置Map
配置文件也可以配置map,配置信息内容如下:
或行内写法:
maptype: {map: {k1: kk1, k2: kk2, k3: kk3}}
map读取和上面的一样,使用@ConfigurationProperties注解来读取,这里省略了注解括号里的 "prefix = " ,具体实现代码如下:
调用类代码如下:
浏览器访问:http://127.0.0.1:8101/yml/readMap
5.3 yml优缺点
优点:
1、可读性高,写法简单,易于理解。2、支持更多的数据类型,可以简单表达对象、数组、List、Map等数据形态。
3、支持更多的编程语言,不止是Java中可以使用,在Golang、Python、Ruby、JavaScript也可以使用。
缺点:
1、不适合写负责的配置文件。
2、对格式有较强的要求(空格)
6. 总结
1、properties是以key=value的形式配置的键值类型的配置文件,yml使用的是树形配置方式。
2、读取配置文件内容,使用 @Value注解,注解内使用 "${ }" 的格式读取。如果要把配置文件放到对象里,就要使用@ConfigurationProperties注解,括号里面写配置文件名,要读取的时候,就使用@Autowired注解注入进来。
3、yml层级之间使用换行缩进的方式配置,key 和 value之间使用 " : " (英文冒号)加空格的方式设置,并且空格不可省略。
4、properties 为早期并且默认的配置文件格式,其配置存在一定的冗余数据,使用yml可以很好的解决数据冗余的问题,但不适合复杂配置。
5、yml 和 properties 可以共存,但一个项目建议使用一种配置类型文件。
如果yml和properties同时存在:
1、两个全部生效,取并集;
2、如果两个配置文件冲突时,properties的优先级要高于yml,以properties为准。
ps:本次的内容就到这里了,如果对你有所帮助的话,就请一键三连哦!!!
本文的封面来自:bilibili苏杉杉的pv,侵权删 url:https://www.bilibili.com/video/BV1vo4y167eh/?spm_id_from=333.999.0.0&vd_source=866da5be2ef0ddd213b053523da53138
————————————————
电子签名:上嘉路