
.properties 文件以键值类型配置,而 .yml 文件采用树形配置方式。@Value 注解,注解内使用 "${}" 的格式读取对应内容。yml 层级之间严格使用换行缩进的方式配置,key 和 value 之间使用冒号加空格的方式设置,并且空格不可省略。properties 作为早期并且默认的配置文件格式,其配置存在一定的冗余数据,而使用 yml 可以很好的解决数据冗余的问题,但不适合复杂配置。yml 可以和 properties 共存,如果存在冲突的内容,优先读取 properties 文件中的内容。
Spring Boot 支持并定义了配置文件的格式,也在另一个层面达到了规范其他框架集成到 Spring Boot 的目的。很多项目或者框架的配置信息也放在配置文件中,比如:
Spring Boot 内置了 Tomcat 服务器,默认端口号是 8080,但是用户电脑上 8080 端口号有可能就被其他应用程序占用了,所以 Spring Boot 需要支持让用户自定义端口号。JDBC 进行了更深层次的封装。让用户通过简单几行代码就可完成数据库的访问。但是不同的应用程序访问的数据库不同,这些持久层框架就需要支持用户可以自定义配置数据库的连接信息。
Spring Boot配置文件有以下三种:
application.propertiesapplication.yml(是 yaml 的简写)application.yaml当应用程序启动时,Spring Boot 会自动从 classpath 路径找到并加载 application.properties 和 application.yaml 或者 application.yml 文件。
也可以通过 spring.config.name 指定文件路径和名称,参考https://docs.spring.io/spring-boot/reference/features/external-config.html#features.external-config.files
properties 配置文件:@Value && @PostConstruct基本的语法是键值对的形式,键值对之间用 = 隔开,如下所示:
# 配置项⽬端⼝号
server.port=9090
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root读取的时候,使用 @Value 注解搭配 ${} 格式读取,如下所示:
@Controller
public class demo1 {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String name; // 不需要和键同名
@Value("${spring.datasource.password}")
private String passwd; // 不需要和键同名
@PostConstruct
public void init() {
System.out.println(url);
System.out.println(name);
System.out.println(passwd);
}
}
@PostConstruct注解的方法会在 当前Bean被Spring完全初始化之后 自动执行一次,常用于初始化逻辑。执行顺序如下所示: static代码块(类加载时) → 构造方法 → 依赖注入 → @PostConstruct -> Bean ready 💥注意:
static代码块是在类加载阶段就执行的,比@PostConstruct要早得多。
yml 配置文件yml 是树形结构的配置文件,它的基础语法是 "key: value",其中 key 和 value 之间使用英文冒号加空格的方式组成,并且空格不可省略!
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
username: root
password: root
#正确的配置方式
mykey1: java
#错误的配置方式❌
mykey2:java注意:value 值默认不用加上单引号或者双引号。
yml 读取配置的方式和 properties 相同,使用 @Value 注解即可,如下所示:
@Controller
public class demo2 {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String name; // 不需要和键同名
@Value("${spring.datasource.password}")
private String passwd; // 不需要和键同名
@Value("${mykey1}")
private String mykey; // 不需要和键同名
@PostConstruct
public void init() {
System.out.println(url);
System.out.println(name);
System.out.println(passwd);
System.out.println(mykey);
}
}注意对应的类型在 java 后端接收的时候要使用对应的类型接收,不然容易出现类型不匹配的错误!
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value1: true
boolean.value2: false
# 整数
int.value: 10
# 浮点数
float.value: 3.14159
# Null,用~表示
null.value: ~
# 空字符串
# 虽然直接后面什么都不加就可以了,但这种方式不直观,更多的表示是使用引号括起来
empty.value: ''YAML 中的 Map 表示的是一组 key: value 键值对,和 Java 的 Map<String, Object> 类似。
database:
host: localhost
port: 3306
username: root
password: 123456可以理解为:
{
"database": {
"host": "localhost",
"port": 3306,
"username": "root",
"password": "123456"
}
}YAML 中的 List 是通过 -(短横线)表示的。
fruits:
- apple
- banana
- orange相当于:
{
"fruits": ["apple", "banana", "orange"]
}servers:
- name: server1
ip: 192.168.1.1
- name: server2
ip: 192.168.1.2相当于 Java 中的 List<Map<String, String>>:
{
"servers": [
{ "name": "server1", "ip": "192.168.1.1" },
{ "name": "server2", "ip": "192.168.1.2" }
]
}user:
name: liren
hobbies:
- coding
- hiking
- reading等同于:
{
"user": {
"name": "liren",
"hobbies": ["coding", "hiking", "reading"]
}
}@ConfigurationProperties 读取 Map 和 List myapp:
name: liren
tags:
- java
- spring
- yaml
metadata:
version: v1.0
author: liren dada
servers:
- name: server1
ip: 192.168.1.1
- name: server2
ip: 192.168.1.2创建如下配置类:
@Data
@Component
@ConfigurationProperties("myapp") // 注意名称要对应
public class MyApp {
private String name; // 普通字段
private List<String> tags; // List
private Map<String, String> metadata; // Map
private List<Server> servers; // 嵌套自定义对象
@Data
public static class Server {
private String name;
private String ip;
}
}然后使用配置类:
@Controller
public class demo {
@Autowired
private MyApp app;
@PostConstruct
public void init() {
System.out.println(app);
}
}
// 运行结果:
MyApp(name=liren, tags=[java, spring, yaml], metadata={version=v1.0, author=liren dada}, servers=[Server(name=server1, ip=192.168.1.1), Server(name=server2, ip=192.168.1.2)])原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。