目录
配置文件最重要的目的"解决硬编码问题(代码写死),把可能会发⽣改变的信息,放在⼀个集中的地⽅
SpringBoot配置文件有三种格式:
①properties ②yaml ③yml(yaml的缩写)
事实上,SpringBoot只支持3个文件
①application.properties ②application.yaml ③application.yml(通常使用这个)
应用程序启动时,SpringBoot会自动从classpath路径找到并加载
也可以通过sspring.config.name指定文件路径和名称
- 理论上,properties 和.yml 可以并存在于⼀个项⽬中,当.properties 和.yml 并存时,两个配置都会加载.如果配置⽂件内容有冲突,则以.properties 为主,也就是 .properties 优先级更⾼
- 虽然理论上来讲.properties 可以和.yml 共存,但实际的业务当中,我们通常会采取⼀种 统⼀的配置⽂件格式,这样可以更好的维护(降低故障率).
很多项⽬或者框架的配置信息也放在配置⽂件中,⽐如:
- 项⽬的启动端⼝(SpringBoot内置了Tomcat服务器,默认端⼝号是8080,但SpringBoot需要⽀持让⽤⼾⾃定义端⼝号)
- 数据库的连接信息(包含⽤⼾名和密码的设置)
- 第三⽅系统的调⽤密钥等信息
- ⽤于发现和定位问题的普通⽇志和异常⽇志等.
SpringBoot创建项目时,就已经自动帮我们创建了配置文件
下面我们在配置文件中修改端口号
XML
server.port=9090
启动程序,观察日志,显示Tomcat启动端口号为9090
properties配置文件
properties配置⽂件是最早期的配置⽂件格式,也是创建SpringBoot项⽬默认的配置⽂件
基本语法
以键值对形式配置,key和value之间以"="连接
XML
# 配置项⽬端⼝号
server.port=8080
(配置文件中以"#"来添加注释信息)
读取配置文件
使用@Value注解在项目中主动读取配置文件中的内容
properties配置
XML
mykey.key1 = bite
java
@RestController
public class PropertiesController {
@Value("${mykey.key1}")
private String key1;
@RequestMapping("/key")
public String key(){
return "读取到值:"+key1;
}
}
properties缺点分析
文件中会有很多冗余信息
为了解决这个问题,可以使用
yml配置文件
yml是yaml的缩写 "Yet Another Markup Language"中文"另一种标记语言"
yml基本语法
key: value(key和value之间使用英文冒号加空格)
java
spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
username: root
password: root
读取配置文件
java
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;
@RequestMapping("/readyml")
public String readYml(){
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
return "yml";
}
}
控制台输出:
可以看出,
- 字符串默认不用加上单引号或双引号
- 单引号会转义特殊字符,使其失去特殊功能,始终是一个普通字符串
- 双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义
配置对象
java
student:
id: 1
name: Java
age: 18
或
java
student: {id: 1,name: Java,age: 18}
使用@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();
}
}
配置list集合
java
dbtypes:
name:
- mysql
- sqlserver
- db2
使⽤@ConfigurationProperties 来读取
java
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
private List<String> name;
}
java
@RestController
public class ReadYml2 {
@Autowired
private ListConfig listConfig;
@RequestMapping("/readList")
public String readList(){
return listConfig.toString();
}
}
配置map
java
maptypes:
map:
k1: kk1
k2: kk2
k3: kk3
或者是使⽤⾏内写法
java
maptypes: {map: {k1: kk1,k2: kk2, k3: kk3}}
使⽤@ConfigurationProperties 来读取
java
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
private HashMap<String,String> map;
}
java
@RestController
public class ReadYml2 {
@Autowired
private MapConfig mapConfig;
@RequestMapping("/readMap")
public String readStudent(){
return mapConfig.toString();
}
}