目录
[@ConfigurationProperties 和@value的区别](#@ConfigurationProperties 和@value的区别)
Spring-Boot配置文件
Spring-Boot中不用编写.xml文件,但是spring-Boot中还是存在.properties文件,同时还有.yml(.yaml)文件
application.properties 文件书写规则
person.name=万某
application.yml(yaml) 文件书写规则
person:
name: 万某
#不同层级之间要有缩进
#冒号后要有空格
注意:
默认配置文件名称:application
Spring-Boot中可以同时存在 三类文件,优先级为:properties > yml > yaml
YAML简介
YAML文件相对传统的.xml文件更能直观的展示数据序列化格式,更加简洁。所以在Spring-Boot中一般使用.yml(.yaml)
YAML基础语法
- 大小写敏感
- 数据值前边必须有空格,作为分隔符
- 使用缩进表示层级关系
- 缩进时使用Tab键
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- "#"表示注释,从这个字符一直到行尾,都会被解析器忽略。
YAML:数据格式
字面量:普通值 [ 数字,布尔值,字符串]
boolean: TRUE #TRUE,true,True,FALSE,false,False均可
float: 3.14 #6.8523015e+5 #支持科学计数法
int: 123 #0b1010_0111_0100_1010_1110 #支持二进制、八进制、十六进制
string: HelloWorld #字符串可以直接书写
数组:一组按次序排列的值( List、set )
address:
- beijing
- shanghai
# 一行内写法
commpany: [阿里巴巴,华为,腾讯,字节跳动]
对象、Map(键值对)
person:
name: 万某
# 行内写法
person: {name: wangzhuo}
#对象数组格式一
users:
- name: Tom
age: 4
- name: Jerry
age: 5
#对象数组缩略格式
users2: [ { name:Tom,age:4 },{ name:Jerry,age:5 } ]
YAML:参数引用
name: 万某
person:
name: xuelaoshi
pet: ${name} # 引用上边定义的name值
name: xuls${random.uuid} # 配置文件占位符,随机uuid
name: ${person.name}_帅
YAML文件读取配置内容
推荐两种方式
逐个注入
在Controller类下给属性分别以@Value注解的方式分别赋值,@Value里的${yaml变量名}。
获取对象就对象.变量名。
获取数组就是使用索引的方式数组[0],在这里表示数组中的第一个值(上海)。
具体代码如下:录后复制
package com.imust.controller;
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;
@RestController
public class HelloController {
@Value("${name}")
private String name;
// 获取对象
@Value("${person.name}")
private String person_name;
@Value("${person.age}")
private int person_age;
// 获取数组
@Value("${address[0]}")
private String address1;
@Value("${address[1]}")
private String address2;
@RequestMapping("/hello")
public String hello(){
System.out.println(name);
System.out.println(person_name);
System.out.println(person_age);
System.out.println(address1);
System.out.println(address2);
System.out.println("========================");
return "Hello,Spring Boot!";
}
}
批量注入
yml文件中写入要批量导入的数据
在person类中添加ConfigurationProperties注解,和person2主名称一致
即可
@ConfigurationProperties 和@value的区别
- 用途和来源:
@Value主要用于从简单的属性文件中注入值,如application.properties
或application.yml
,而@ConfigurationProperties则用于从带有嵌套属性的复杂配置文件中注入值。
- 类型安全性:
@Value不支持类型安全,需要进行手动类型转换,而@ConfigurationProperties支持类型安全,通过自动绑定和类型转换实现。
- 复杂性:
@Value适用于简单的属性注入场景,而@ConfigurationProperties适用于复杂的配置文件场景,能够处理嵌套属性、列表、集合等。
- 自定义属性:
@Value不支持自定义属性,而@ConfigurationProperties支持自定义属性,可以通过prefix、ignoreInvalidFields等参数进行配置。
- 松散绑定和SpEL支持:
@ConfigurationProperties支持松散绑定,允许在配置文件中使用不同的命名约定(如使用下划线、驼峰命名法等),而@Value不支持松散绑定。此外,@ConfigurationProperties不支持SpEL表达式,而@Value支持。
- JSR303数据校验和复杂类型封装:
@ConfigurationProperties支持JSR303数据校验,而@Value不支持。同时,@ConfigurationProperties支持复杂类型的封装(如map),而@Value不支持。