点进来你就是我的人了
博主主页:戳一戳,欢迎大佬指点!欢迎志同道合的朋友一起加油喔
目录
1. Spring Boot 项目中配日文件的作用是什么
2. Spring Boot 配置文件的两种格式
1. properties的语法
2. yml的语法
3. properties与yml的对比
4. 设置不同环境下的配置文件
3. 更多的系统配置项
配置文件中最主要的两个作用: 连接数据库和用于定位问题的关键日志.
- 一个项目中没有数据库的话那就谈不上一个完整的项目.
- 假设你正在使用一个在线购物网站。你在购物车里放了一些想买的东西,准备稍后结账。但如果这个网站没有数据库来保存这些信息,你可能会发现当你回来时,购物车里的物品都不见了。
- 另一方面,如果这个网站没有配置文件,那么在出现问题时,开发人员可能会很难找出问题的原因。例如,如果支付系统突然出现故障,没有配置文件的话,可能就难以追踪到具体出了什么问题。
配置文件的作用:
Spring Boot 中有两种格式的配置文件:
- properties (application.properties) (Spring Boot项目创建时默认的格式)
- yml / ymal (application.yml)
Spring Boot 中这两种格式的配置文件的命名方式必须以 application 开头, 否则配置就不会生效, 这就牵扯到了高级框架中的 "约定大于配置" , 我们要做的事情越来越少了, 但是要遵守的约定越来越多了.
【问题】为什么需要两种格式的配置文件呢 ? 仅仅是为了提供更多的选择 ?
1. yml 相比于 properties 在写法上简化了许多 (后面会演示代码)
2. 在跨平台等问题上也是有很大的优势 (后面会讲到)
【问题】两种格式的配置文件如果同时存在, 会以哪种格式为主?
1. 当一个项目中出现了两种格式的配置文件时, properties 格式的配置文件优先级高, 所以会以 properties 格式的配置文件为主. 例如 properties 配置文件中设置了端口为 8081, .yml 配置文件中也设置了端口, 为 8082, 那么最终程序启动时的端口就是 8081, 但是加载完 properties 文件之后, 也会加载 .yml 文件中的配置信息.
2.理论上是这两种格式的配置文件可以出现在一个项目中, 但是一般都会统一配置文件,如果两种格式都写了, 可能会有增加排查问题的风险; 就好比衣服种类有很多, 但是一个餐厅里的服务员一般都会统一服装, 否则会显得杂乱无章, 不正式
properties以键值的形式配置,键和值中间用 =
连接起来(key=value
),配置文件中的 #
代表注释信息
# 配置系统端口
server.port=8082
# 配置数据库源
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/blog?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
这些配置都属于系统配置项(给Spring框架用),用户还可以自定义配置项(可在程序中用)
用户自定义配置
# 自定义配置
name=张三
age=20
在程序中如何读取自定义的配置项呢?
使用 @Value(“${ xxx }”) 的方式可读取用户自定义的配置
@Value("${name}")
private String name;
@Value("${age}")
private int age;
读取的时候,自定义与系统的配置项都可以获取到
【代码实例】
@Controller
@ResponseBody //加在类上, 表示当前类中的所有方法返回的都是非静态页面的数据
public class TestController {
//读取用户自定义的配置
//一定要是${key}格式
@Value("${name}")
private String name;
@Value("${age}") // 读取用户自定义的配置
private String age;
@Value("${server.port}") //读取系统配置项
private int port;
@RequestMapping ("/sayHi") // = WebServlet("/URL")
public String sayHi() {
return "hello world " + "->" + name + age + " port = " + port;
}
}
浏览器输入url(http://localhost:9090/sayHi)之后显示结果如下:
properties的优缺点
yml是yaml的缩写,它的语法格式为 key: value
,其中冒号为英文格式,并且value与冒号中间的空格不可省略
# 系统端口号
server:
port: 8083
# 数据库源信息
spring:
datasource:
username: root
password: 123456
yml支持更多的数据类型
# 字符串
str1: 你好 \n 你好
str2: '你好 \n 你好'
str3: "你好 \n 你好"
# 布尔值
flag1: true
flag2: false
# 整数
num: 10
# 浮点数
pai: 3.14
# null ~代表null
Node: ~
读取的方式与properties格式相同,使用@Value("${ xxx }")
@Component
public class TestYml {
@Value("${str1}")
private String str1;
@Value("${str2}")
private String str2;
@Value("${str3}")
private String str3;
@Value("${num}")
private int num;
@Value("${flag1}")
private boolean flag1;
@Value("${flag2}")
private boolean flag2;
@Value("${pai}")
private double pai;
@Value("${node}")
private String node;
//该注解代表构造方法,初始化bean的时候会调用该方法
@PostConstruct
public void construct(){
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
System.out.println(num);
System.out.println(pai);
System.out.println(flag1);
System.out.println(flag2);
System.out.println(node);
}
}
打印结果:
从上述字符串的打印发现:
yml配置对象
# 对象
student1:
id: 1
name: 张三
age: 10
# 对象的行内表示
student2: {id: 2,name: 李四, age: 15}
读取对象使用 @ConfigurationProperties
注解
@Component
@ConfigurationProperties("student1")//这里不需要使用$
@Getter
@Setter //这里是通过set方法赋值属性的,提供set方法
@ToString
public class Student {
//字段与yml里的名称相同
private int id;
private String name;
private int age;
}
测试类:
@Controller
public class StudentController {
@Autowired
private Student student;
@PostConstruct
public void printStu(){
System.out.println(student);
}
}
yml配置list集合
# list集合
nametype:
name:
- 张三
- 李四
@Component
@ConfigurationProperties("nametype")
@Setter
@Getter
@ToString
public class TestList {
private List name;
}
@Controller
public class ListController {
@Autowired
private TestList testList;
@PostConstruct
public void printList(){
System.out.println(testList);
}
}
yml的优点
key=value
的格式,yml是以key: value
的格式,并且层级之间使用换行缩进方式配置,vlaue与:之间的空格不可省略一般项目分为三个环境:
在实际的项目开发过程中,我们可能有测试环境、开发环境、部署环境,这些环境下使用的数据库连接或者项目启动的端口号可能都不太相同,只有一份配置文件,如果在不同的环境下运行程序的话就需要我们频繁地去修改配置文件,如果修改的配置项目少还好;如果多呢?不仅效率低,还可能出错。那么我们应该怎么解决这种这种问题呢?
环境不同可能配置项存在差异,如数据库源,端口号不同等差异
我们可以使用如下配置文件的方式解决:
在公共的配置文件中(application.yml)添加如下配置项:
# 设置配置文件的运行平台
spring:
profiles:
active: dev
示例:开发环境端口要求4567,测试环境端口要求5678,线上环境端口要求1234
主配置文件application.yml
中的配置项spring.profiles.active
即可链接: 点击获取更多的系统配置项