目录
- 一、认识SpringBoot配置文件
- 二、properties配置文件
- 1、添加配置
- 2、读取配置文件
- 三、yml文件
- 添加配置和读取
- 1. 普通的配置信息
- 2. 配置不同的数据类型
- 3. 配置对象
- 4. 配置集合
SpringBoot配置文件,整个项目中所有的重要数据都是在配置文件中配置的
一、认识SpringBoot配置文件
1、SpringBoot配置文件的作用:
- 数据库的连接信息(url、用户名、密码)
- 项目的启动端口
- 第三方系统的调用密钥等信息
- 日志
配置文件中的信息,一部分是给系统用的(如启动端口);一部分是给业务代码用的(如数据库的连接信息、第三方系统的调用密钥等)
配置文件中的信息,是以键值对的形式(key和value)组织的,key的命名一部分是系统提供的(如server.port、spring.database等),一部分是用户自定义的(如配置不同的数据类型、对象、集合)
2、SpringBoot配置文件的格式:
- .properties
- .yml
3、关于两种格式
- SpringBoot约定,SpringBoot启动时,只有名字为 application.properties / application.yml 的配置文件,会被直接读取,其他名字的配置文件不会读取(但是使用其他名字的配置文件也是合法的配置文件)
- .properties是旧版,.yml是新版;当 .properties 和 .yml 同时存在于同一个项目中时,如果两个文件中有同样的配置(如都设置了server.port),那么以 .properties 中的配置为主( .properties 配置文件的优先级最高,但加载完 .properties 文件后,也会加载 .yml 文件)
二、properties配置文件
1、添加配置
使用键值对的方式添加配置,key=value
千万不要随便加空格
application.properties 文件
# 系统提供的key
# 设置端口号
server.port=9999
# 系统提供的key
# 设置数据库信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/manageplayers
spring.datasource.username=root
spring.datasource.password=123456
# 用户自定义的key、value
college=弘毅拓新
需要注意的是,.properties文件 中使用中文时,需要将 .properties文件 的默认字符编码方式设置为 utf-8勾选 Transparent native-toascii conversion
当前 application.propertise 文件中的中文 显示的还是中文,而不是ASCLL码
2、读取配置文件
- 使用 @Value(“${key}”)
key 表示 配置文件中的 key 值 - 如果 @Value(“${key}”) 中的 key 值在配置文件中不存在,SpringBoot启动时会报错
1. 设置一个Test类
package com.example.SpringBoot;
@Controller
@ResponseBody // 说明返回的是 非页面的数据 (而不是静态页面),由SpringBoot进行数据加工
public class Test {
@Value("${college}")
private String str;
@Value("${server.port}")
private Integer port;
@RequestMapping("/college")
public String getCCTalkToken(){
System.out.println(str);
return " port: " + port + " " + str;
}
}
2. 启动SpringBoot,访问url(localhost:9999/college),返回响应页面
SpringBoot的启动端口为9999,在浏览器输入localhost:9999/college,得到访问结果:
三、yml文件
yml配置文件的优势:
- 可读性强,使用类似json格式的树形配置方式进行配置的,层级之间使用换行缩进
- 写法简洁,properties文件配置存在数据冗余问题,使用yml可以很好的解决数据冗余问题
- 可以表述更加复杂的数据结构,如对象、集合、不同的数据类型
- 通用性强,可以跨语言,java、go、python都可以使用yml作为配置文件
添加配置和读取
使用键值对的形式添加配置, key: value
- 一定要注意,key:后面加有一个空格,再加上value
- 注意缩进
1. 普通的配置信息
(1)application.yml
# 系统提供的key
# 设置端口号
server:
port: 9527
# 系统提供的key
#设置数据库信息
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/manageplayers
username: root
password: 123456
(2)读取配置文件
读取普通的配置信息和读properties文件一样
package com.example.SpringBoot
@Controller
@ResponseBody // 说明返回的是 非页面的数据 (而不是静态页面),由SpringBoot进行数据加工
public class Test {
//读取配置文件中 cctalk.token 对应的信息
@Value("${spring.datasource.url}")
private String str;
@Value("${server.port}")
private Integer port;
@RequestMapping("/college")
public String getCCTalkToken(){
System.out.println(str);
return " port: " + port + " " + str;
}
}
(3)启动SpringBoot,访问url(localhost:9527/college),得到响应界面
2. 配置不同的数据类型
配置不同的数据类型,key是用户自己定义的,随便取名
(1)application.yml
# 均为用户自定义的key、value
# 字符串
myString1:
你好 \n 世界!!!
myString2:
'你好 \n 世界!!!'
myString3:
"你好 \n 世界!!!"
# 整数
myInteger:
666
# null
# 不是有个值叫作 null,是啥也没有
myNull:
null
# 布尔值
myBoolean:
value:
true
(2)读取配置文件
package com.example.SpringBoot;
@Controller
@ResponseBody // 标识 方法返回的是非静态页面的数据
public class ReadConfigController {
@Value("${myString1}")
private String myString1;
@Value("${myString2}")
private String myString2;
@Value("${myString3}")
private String myString3;
@RequestMapping("/getString")
public String getMyString(){
System.out.println(myString1);
System.out.println(myString2);
System.out.println(myString3);
return myString1;
}
@Value("${myInteger}")
private Integer myInteger;
@RequestMapping("/getInteger")
public Integer getMyInteger(){
return myInteger;
}
@Value("${myNull}")
private Object myObject;
@RequestMapping("/getNull")
public Object getMyObject(){
return myObject;
}
}
(3)访问url(localhost:9527/getNull),得到响应页面
关于.yml配置文件 中的value加单双引号
字符串默认不用加单引号或双引号,如果加上英文的单引号或双引号可以表示特殊的含义
- 单引号会转义特殊字符,特殊字符最终只是一个普通的字符串数据(‘/n’ 最终打印 /n)
- 双引号不会转义字符串里面的特殊字符;特殊字符会作为本身想要表示的意思(“/n” 最终打印 换行)
浏览器输入 localhost:9527/getString
IDEA控制台:
3. 配置对象
(1)application.yml
有两种配置方法
# 用户自定义key、value
# 配置对象
student1:
university: 西北工业大学
address: 西安
student2: {university: 西北大学,address: 西安}
(2)读取配置文件中的对象
使用 @ConfigurationProperties(prefix = “key”)
- 此处的key和配置文件中key匹配,不匹配也不会报错
- 实体类中属性和配置文件中对象的属性,是通过setter方法(setter方法的方法名)匹配的,而不是属性名;set + 配置文件中对象属性名,就表示要将它设置到实体类中;参数就是它的值;方法体决定设置给当前类的哪个属性
- 当有多余的属性或setter方法,也是没有关系的
在Component包下面,创建一个实体类Student(名字随便)
- 通过@ConfigurationProperties读取配置文件中的对象
- 一定要有setter方法,SpringBoot调用setter方法,将配置文件中对象的信息,设置给对应的成员属性
- 一定要有类注解,SpringBoot容器中就有了一个Student对象
package com.example.SpringBoot.Component;
@Component
@ConfigurationProperties(prefix = "student2")
public class Student {
public String college;
public String location;
public String score;
public String getCollege() {
return college;
}
// 将配置文件中 Student2 对象 的属性 university 设置给 college
public void setUniversity(String college) {
this.college = college;
}
public String getLocation() {
return location;
}
// 将配置文件中 Student2 对象 的属性 address 设置给 location
public void setAddress(String location) {
this.location = location;
}
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
}
(3)使用对象
package com.example.SpringBoot;
@Controller
@ResponseBody // 标识 方法返回的是非静态页面的数据
public class ReadConfigController {
@Autowired
private Student student;
@RequestMapping("/getStudent")
public HashMap<String,String> getStudent(){
HashMap<String,String> map = new HashMap<>();
map.put("university", student.getUniversity());
map.put("address", student.getAddress());
return map;
}
}
(4)访问url(localhost:9527/getStudent),返回的响应页面
4. 配置集合
(1)application.yml
有两种配置方法
# 用户自定义的 key、value
# 配置集合
# list 是集合的名字
dbtypes1:
list:
- 刘备
- 关羽
- 张飞
dbtypes2: { list: [ 曹操,张辽,徐晃] }
(2)读取配置文件中的集合
通过 @ConfigurationProperties(prefix = “key”) 读取
此处的setter方法与 配置对象 的setter方法一样;SpringBoot调用setter方法,通过setter方法名(setter + 配置文件中集合名称)找到配置文件中对应的集合,将配置文件中集合设置给当前类的集合,在Component包下面,创建一个实体类DB,其属性之一为集合
package com.example.SpringBoot.Component;
@Component
@ConfigurationProperties(prefix = "dbtypes2") // 一定要和配置文件中的key对应
public class DB {
private List<String> array;
private String name;
public List<String> getArray() {
return array;
}
// 将配置文件中 dbtypes2 中的 list 设置给 array 属性
public void setList(List<String> array) {
this.array = array;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
(3)使用这个集合
package com.example.SpringBoot;
@Controller
@ResponseBody // 标识 方法返回的是非静态页面的数据
public class ReadConfigController {
@Autowired
private DB db;
@RequestMapping("/getList")
public List<String> getList(){
return db.getArray();
}
}
(4)访问url(localhost:9527/getList),返回响应页面
需要注意的是 @ConfigurationProperties 中的 prefix 属性值有要求:prefix值应该用小写字母、数字、中划线“-”区分单词