【Spring】Spring配置文件
目录
什么是配置文件?
配置文件的作用
SpringBoot配置文件
配置文件格式
配置文件的优先级
properties配置文件说明
properties基本语法
读取配置文件
properties缺点
yml配置文件说明
yml基本语法
使用yml连接数据库
yml配置不同数据类型及null
注意事项
@PostConstruct
配置对象
配置集合
配置Map
yml配置文件的优缺点
优点
缺点
总结
什么是配置文件?
配置文件是一种存放应用程序或系统配置的文件,包含了程序运行时所需要的各种选项和配置信息,例如字体样式、默认语言等。它允许开发者和用户在不修改代码的情况下,调整应用程序的行为和性能。配置文件通常以文本形式存在,格式可以是XML、JSON、YAML(yml)、INI、Properties等。
配置文件的作用
配置文件主要是为了解决硬编码代码的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行。
使用配置文件,可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互。
硬编码指的是将数据直接嵌入到程序或者其他可执行对象的源代码中,也就是我们常说的将“代码写死”。
SpringBoot配置文件
SpringBoot支持并定义了配置文件的格式,也是在另一个层面达到了规范其他框架集成到SpringBoot的目的。
很多项目或者框架的配置信息也放在配置文件中,如:
- 项目的启动端口号
- 数据库的连接信息(包含用户名和密码的设置)
- 第三方系统的调用密钥等信息
- 用于发现和定位问题的普通日志和异常日志等
在SpringBoot中,内置了Tomcat服务器,默认端口号是8080,但在用户电脑上8080端口号可能会被其他应用程序占用,此外,如果启动多个SpringBoot项目,那么端口号也需要不同,所以SpringBoot需要支持让用户自定义端口号。
配置文件格式
在SpringBoot中,有三种不同形式的配置文件:
- application.properties
- application.yml
- application.yaml
yml是yaml的缩写,实际开发中出现的频率最高。yaml和yml使用方式是一样的,都是键值对的形式,所以后面我们只讲yml。
当应⽤程序启动时,SpringBoot会⾃动从classpath路径找到并加载
application.properties 和 application.yaml 或者 application.yml ⽂件,当然也可以使用 spring.config.name 指定文件路径和名称。
配置文件的优先级
- 理论上,application.properties 和 application.yml 是可以同时存在同一个项目中的,当这两个配置文件都存在,两个配置都会加载。如果配置文件内容有冲突,以application.properties 为主,即 application.properties 的优先级更高。
- 虽然在理论上两个配置文件可以共存,但在实际的业务中,我们都是采用一种统一的配置文件,这样可以更好的维护(降低故障率)。
properties配置文件说明
properties配置文件是最早期的配置文件格式,也就是创建SpringBoot项目默认的配置文件。
properties基本语法
properties是以键值对的形式配置的,key和value之间用“=”来连接。
示例:
#配置项目端口号
server.port=9090
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/beantext?characterEncoding=utf-8&useSSL=false
#配置数据库用户名
spring.datasource.username=root
#配置数据库密码
spring.datasource.password=root
#配置数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
配置文件中使用 # 来添加注释信息。
读取配置文件
在项目中,如果我们想要读取到配置文件中的内容,需要使用 @Value 注解,并且在注解中使用“${}”的格式来读取。
my.text=hello world
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/pro")
@RestController
public class PropertiesController {
@Value("${my.text}")
private String key;
@RequestMapping("/text1")
public String getValue() {
return "获取到的value为:" + key;
}
}
properties缺点
properties配置是以键值对的形式配置的,我们通过观察,可以看到里面有些代码比较冗余。
此外,properties配置格式对中文也是不友好,我们把value值换为中文,再来试一下:
my.text=你好 世界
为什么会这样,我们可以打断点看一下:
可以看到,key的值是四个问号。 但是idea默认的字符集是UTF-8,是支持中文的,为了防止这种情况发生,所以我们在properties配置文件中尽量不要出现中文。
接下来,我们来讲一下yml配置文件。
yml配置文件说明
yml是yaml的缩写,全程是 Yet Another Markup Language 翻译过来就是“另一种标记语言”。
yml基本语法
yml是树形结构的配置文件,基本语法是:key: value(注意:冒号后面是有空格的,不能省略!!!)
key后+(冒号+空格)
我们可以看到,正确的写法的key是会有高亮提示的(橙色,当然应该可以设置成其他颜色),而对于错误的写法,key还是灰色。
此外,只要冒号有空格隔开,就是正确的写法,至于空格的数量,是不限的,当然按照规范来写的话,最好就一个。
使用yml连接数据库
spring:
datasource:
url: jdbc:mysql://localhost:3306/beantext?characterEncoding=utf-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
可以看到,相对properties配置文件的写法,yml配置文件的写法不仅能够体现出层级关系还能节省不必要的代码。
此外,yml还有其他操作。
yml配置不同数据类型及null
# 字符串
string.value: hello
# 布尔类型
boolean.value: true
boolean.value1: false
# 整数类型
int.value: 10
# 浮点数
float.value: 3.14159
# Null ~ 代表null
null.value: ~
# "" 空字符串
# '' 单引号也表示空字符串
# 冒号后面什么都不加也可以表示空字符串。但这种方式不直观,更多的表示是使用引号括起来
empty:
value1: ''
value2: ""
value3:
那么yml配置文件的属性应该如何获取?
其实跟properties配置文件获取属性的操作一样,都是要使用 @Value 注解来进行获取的。
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/pro")
@RestController
public class PropertiesController {
@Value("${string.value}")
private String value;
@Value("${boolean.value}")
private Boolean value1;
@Value("${boolean.value1}")
private Boolean value2;
@Value("${int.value}")
private Integer value3;
@Value("${float.value}")
private Float value4;
@Value("${null.value}")
private String value5;
@RequestMapping("/getValue")
public String getValue() {
return "获取到的value为:" + value+" | "+value1+" | "+value2+" | "+value3+" | "+value4+" | "+value5;
}
}
注意事项
字符串默认不用加上单引号或者双引号,如果加英文的双引号可以表示特殊的含义,而如果加英文的单引号则不会表示特殊的含义。
我们来看个例子来理解这段话的意思:
string:
value1: Hello \n SpringBoot
value2: 'Hello \n SpringBoot'
value3: "Hello \n SpringBoot"
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/pro")
@RestController
public class PropertiesController {
@Value("${string.value1}")
private String value1;
@Value("${string.value2}")
private String value2;
@Value("${string.value3}")
private String value3;
@RequestMapping("/getValue")
public String getValue() {
System.out.println(value1);
System.out.println(value2);
System.out.println(value3);
return "OK";
}
}
可以看到,不加引号的和加单引号的不会让“\n”进行换行,而加双引号的依旧会让"\n"进行换行操作。
我们可以得出结论:
- 字符串默认不用加上单引号或双引号;
- 单引号会转义特殊字符,使其失去特殊功能,始终是一个普通的字符串;
- 双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义。
可能会有点绕,\n本义是换行
使用单引号会转义,就是说不再换行了,\n只是一个普通的字符串;
使用双引号不会转义,就是说\n依旧是它本身的含义,即换行。
这里我们来了解一个新的注解:@PostConstruct
@PostConstruct
@PostConstruct可以标注在方法上,被标注的方法会在Spring容器完成Bean的实例化和依赖注入之后自动执行。所以我们这里可以偷个懒,后面的讲解我们就使用这个注解来帮我们完成测试。
需要注意:
- 用该注解修饰的方法必须是非静态方法;
- 不能有参数;
- 返回类型通常是void。
配置对象
yml配置文件不仅能配置一些基本的数据类型,还能配置对象。
写法如下:
#配置对象
student:
name: '张三'
age: 18
也可以写成行的形式:
#行的形式
student1: {name: '张三', age: 18}
那么这个时候我们就不能使用 @Value 注解来获取配置中的对象了,需要使用另外一个注解@ConfigurationProperties 来读取,如下:
package com.example.demo.model;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "student")//prefix表示前缀
public class Student {
private String name;
private int age;
}
@Controller
public class PropertiesController {
@Autowired
private Student student;
@PostConstruct
public void getStudent() {
System.out.println(student);
}
}
配置集合
ymp还可以配置集合。
配置格式:
在-后一定要加空格,否则-和后面的内容就成了整体,统一赋值给对应的属性
type:
list:
- 'zhangsan'
- 'lisi'
- 'wangwu'
package com.example.demo.model;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@Data
@Component
@ConfigurationProperties("type")
public class ListConfig {
private List<String> list;
}
@Controller
public class PropertiesController {
@Autowired
private ListConfig listConfig;
@PostConstruct
public void getList() {
System.out.println(listConfig.toString());
}
}
配置Map
package com.example.demo.model;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;
@Data
@Component
@ConfigurationProperties("maptypes")
public class MapConfig {
private Map<String, String> map;
}
package com.example.demo.controller;
import com.example.demo.model.ListConfig;
import com.example.demo.model.MapConfig;
import com.example.demo.model.Student;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Controller
public class PropertiesController {
@Autowired
private MapConfig mapConfig;
@PostConstruct
public void getMap() {
System.out.println(mapConfig);
}
}
yml配置文件的优缺点
优点
- 可读性⾼,写法简单, 易于理解
- 采用缩进和嵌套来表示层次结构,适合非常复杂配置的管理
- ⽀持更多的数据类型, 可以简单表达对象, 数组, List,Map等数据形态.
- ⽀持更多的编程语⾔, 不⽌是Java中可以使⽤, 在Golang, Python, Ruby, JavaScript中也可以使⽤
缺点
- 不适合写复杂的配置⽂件
- 对格式有较强的要求(⼀个空格可能会引起⼀场⾎案),对缩进敏感
总结
什么是配置文件?
配置文件是用来存放应用程序或者系统的配置的文件,可以在不动源码的情况下对应用程序的性能和行为进行调整,使用配置文件,可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互。
SpringBoot的配置文件
Spring有三种配置文件:
- application.properties
- application.yml
- application.yaml
application.properties 和 application.yml 是可以同时存在同一个项目中的,以application.properties为主,.properties的优先级更高。
配置文件的格式
- application.properties:键值对形式,key和value用“=”隔开
- application.yml:也是键值对,key和value用“冒号+空格”隔开。
读取配置文件的方式
对于基本的数据类型,我们采用 @Value 注解即可,但对于对象、集合、map这些,我们需要使用 @ConfigurationProperties 。
@PostConstruct可以标注在方法上,被标注的方法会在Spring容器完成Bean的实例化和依赖注入之后自动执行。要求是:方法不能是静态方法,不能有参数,返回值尽量为void。
以上就是本篇所有内容~
若有不足,欢迎指正~