目录
配置文件
配置文件是一种文本文件,其中包含应用程序、软件或系统的特定设置和参数。
配置文件主要是为了解决硬编码带来的问题,将可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行。
硬编码:将数据直接嵌入到程序或其他可执行对象的源代码中,也就是我们常说的"代码写死".
SpringBoot配置文件
SpringBoot的配置文件是用来配置SpringBoot 应用程序的各种参数和设置的文件
很多项目或者框架的配置信息放在配置文件中,如:
(1)项目的启动端口
(2)数据库的连接信息(包含用户名和密码的设置)
(3)第三方系统的调用密钥等
(4)用于发现和定位问题的普通日志和异常日志
...
配置文件的应用
初步使用配置文件
SpringBoot内置了Tomcat服务器,其默认端口号是8080,但电脑上8080端口号可能被其他应用程序占用,因此,SpringBoot支持用户自定义端口号
我们通过自定义端口号来了解配置文件
SpringBoot在创建项目时,就已经创建了配置文件:
我们写一个简单的程序:
@RestController
public class test {
@RequestMapping("/hello")
public String hello(){
return "hello...";
}
}
运行,并观察日志:
访问程序:http://127.0.0.1:8080/hello
我们在配置文件中修改端口号:
再次运行程序,观察日志:
接着,我们通过访问程序进行测试:http://127.0.0.1:9090/hello
此时再次运行:http://127.0.0.1:8080/hello
配置文件的格式
SpringBoot配置文件有以下三种:
application.properties
application.yml
application.yaml
其中,yml是yaml的简写,使用频率较高,yaml与yml的使用方式是相同的,因此我们学习了yml文件的使用后,也就能够使用yaml文件
当应用程序启动时,SpringBoot会自动从classpath路径找到并加载application.properties 、application.yaml 或 application.yml 文件
其中,yml 和 properties 的区别 类似与商品的新旧包装,properties类型的配置文件就属于旧包装,也就是是创建SpringBoot项目时默认的文件格式(仓库里还有库存),而yml属于新包装
properties 配置文件
properties 配置文件是最早期的配置文件格式,也是创建SpringBoot项目时默认的配置文件
properties的基本语法
properties 是以 键值对 的形式配置的,key 与 value 之间通过 = 连接:
其中,配置文件使用 # 来添加注释
properies配置文件
在项目中,当我们想要读取配置文件中的内容时,可以使用 @Value 注解来实现
@Value 注解使用 "${}" 格式读取
配置:
读取:
@RestController
public class test {
@RequestMapping("/hello")
public String hello(){
return "hello...";
}
@Value("${name}")
private String name;
@RequestMapping("/readConfig")
public String readConfig(){
return "读取到:" + name;
}
}
运行结果:
properties的缺点
properties配置是以 key - value 的形式配置的:
我们可以看出,properties配置文件中会有很多的冗余信息:
想要解决这个问题,我们可以使用 yml 配置文件
yml 配置文件
yml的基本语法
yml是 树形结构 的配置文件,其基础语法为 key: value
其中,key 和 value 之间由 英文冒号和空格 组成,空格不可省略
我们创建 yml 文件,但由于我们已经有了一个 properies文件,
properties文件 和 yml文件可以存在于一个项目中吗?
我们直接创建 yml 文件:
发现 .properties 和 .yml 可以共存
我们使用 yml 文件进行配置:
配置时需要注意冒号后必须要有空格,当未加空格时 key 也没有高亮显示
使用 yml 连接数据库:
此时,相比于 使用 properies 连接数据库:
使用 yml 时,配置文件更加清晰、易读,更方便地处理较长的配置信息
yml配置读取
yml 的读取与 properies 相同,使用 @Value:
@Value("${age}")
private int age;
@RequestMapping("/readAge")
public String readAge(){
return "读取到:" + age;
}
运行结果:
此时,我们再来思考一个问题:
既然 .properies 和 .yml可以共存,当配置文件内容冲突时会怎样呢?
我们配置 name来进行测试:
yml中 : name: lisi
properies中 : name=zhangsan
运行结果:
我们可以发现: 当 .properties 和 .yml 共存时,两个配置文件都会加载,而当配置文件内容存在冲突时,以 .properties 为主,也就是 .properties 的优先级更高
虽然 .properties 和 .yml 可以共存,但我们通常采取一种统一的配置文件格式(方便维护)
value值加单双引号
字符串默认不用加 单引号 或 双引号,但当加上 单引号 或 双引号时:
@Value("${str1}")
private String str1;
@Value("${str2}")
private String str2;
@Value("${str3}")
private String str3;
@RequestMapping("/readStr")
public void readStr(){
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
return;
}
运行结果:
我们可以看出:当加上 双引号 时,字符串中的特殊字符表示其特殊含义,而当 不加 或加 单引号 时,字符串中的特殊字符是普通字符
配置对象
我们可以在 yml 中配置对象:
或是使用行内写法:
student: {id: 001, name: zhangsan, age: 18}
此时 读取配置文件中的对象,就不能再使用 @Value 了,而要使用 @ConfigurationProperties
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;
}
访问:
@Controller
public class StudentController {
@Autowired
private Student student;
@RequestMapping("/readStudent")
public String readStudent(){
return student.toString();
}
}
运行结果:
配置集合
yml 也可以配置集合:
也可以写成行内样式:
listname: {name: [zhangsan, lisi, wangwu]}
与读取对象相同,集合也需要使用 @ConfigurationProperties 来读取:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@ConfigurationProperties(prefix = "listname")
@Data
@Component
public class ListConfig {
private List<String> name;
}
访问:
@Autowired
private ListConfig listConfig;
@RequestMapping("/readList")
public String readList(){
return listConfig.toString();
}
运行结果:
配置Map
yml 还可以配置Map:
同样,Map使用 @ConfigurationProperties 来读取:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;
@ConfigurationProperties("employees")
@Data
@Component
public class MapConfig {
private Map<String, String> info;
}
获取Map:
@Autowired
private MapConfig mapConfig;
@RequestMapping("/readMap")
public String readMap(){
return mapConfig.toString();
}
运行结果:
yml 优缺点
优点:
(1)可读性高,写法简单,易于理解
(2)支持更多数据类型,可以简单表达对象、数组等数据形态
(3)支持更多编程语言,在Java、python、JavaScript等中也可以使用
缺点:
(1)不适合写复杂的配置文件
(2)对格式有较强的要求(尤其要注意空格)