@Value和@ConfigurationProperties的对比
-数据校验的依赖--> <!server: port: 8085 person: id: 1 name: "张三" address: street: "河北省" city: "石家庄" postalCode: "050000" boss: true age: 20 birth: "2026/12/06" email: "2041130670@qq.com" hobby: "篮球" # 这个属性会被
1.值的注入
方式一:
@ConfigurationProperties批量注入配置文件中的属性
实体类配置:
@Component @ConfigurationProperties(prefix = "person") public class person { private Integer id; private String name; private String address; private boolean boss; @DateTimeFormat(pattern = "yyyy/MM/dd") private Date birth; private Integer age; private String email; //getter/setter //toString
PersonController配置
@Controller public class PersonController { @Autowired private person person; @RequestMapping("/person") public void printPerson() { System.out.println(person); } }
yml配置:
server: port: 8085 person: id: 1 name: "张三" address: "河北省" boss: true age: 20 birth: "2026/12/06" email: "2041130670@qq.com" maps: k1: "value1" k2: "value2"
启动后拿到了值
![]()
方式二:@Value方式注入值
实体类有变,其余不变
@Component public class person { @Value("${person.id}") private Integer id; @Value("${person.name}") private String name; @Value("${person.address}") private String address; @Value("${person.boss}") private boolean boss; @Value("${person.birth}") @DateTimeFormat(pattern = "yyyy/MM/dd") private Date birth; @Value("${person.age}") private Integer age; @Value("${person.email}") private String email; //getter/setter //toString
启动后拿到了值
![]()
2.@ConfigurationProperties的松散绑定
在yml里加一个实体类中没有的字段hobby
server: port: 8085 person: id: 1 name: "张三" address: "河北省" boss: true age: 20 birth: "2026/12/06" email: "2041130670@qq.com" 验证松散绑定:增加一个实体类中没有的hobby,这时启动发现springboot没有报错,值也没有绑定上,springboot将其忽略了,这就是松散绑定 hobby: "篮球"
这时启动发现springboot没有报错,值也没有绑定上,springboot将其忽略了,这就是松散绑定
3.@Value的SqEL
SpEL是一种功能强大的表达式语言,可以在 Spring 中用来进行动态计算。
SpEL 允许你在 Spring 中进行动态计算,可以使用配置文件中的值进行加法、减法等操作,甚至进行更复杂的逻辑运算。
SqEL的意义:避免端口号冲突,将端口号增加一些偏移量
新建dog实体类
@Component public class dog { @Value("${dog.name}") // 从配置文件中注入 dog.name private String dogName; @Value("${dog.sex}") // 从配置文件中注入 app.version private String dogSex; // 使用 SpEL 计算动态值 @Value("#{${dog.port} + 1000}") // 动态计算新的端口值 private Integer adjustedPort; @Value("${dog.easilyMad}") private boolean easilyMad;
@Value("#{${dog.port} + 1000}") 是使用 SpEL 计算新的端口值
#{...}:这个大括号包裹的部分表示 SpEL 表达式。在这里,SpEL 表达式会计算里面的内容,计算结果会注入到 adjustedPort 字段中。
${dog.port} + 1000:这个表达式意味着获取 dog.port 的值(即 8080),然后加上 1000,最终的结果是 8080 + 1000 = 9080。
@Value("#{${dog.port} + 1000}"):Spring 会将 dog.port 的值(8080)与 1000 相加,得到 9080,然后将 9080 注入到 adjustedPort 字段中。
结果:
当 Spring 启动时,dog.port 的值被读取(在本例中为 8080),然后通过 SpEL 表达式将 8080 + 1000 的结果(即 9080)注入到 adjustedPort 字段。因此,adjustedPort 的值将是 9080。
yml改为
dog: name: "wangcai" sex: "雄性" port: 8080 easilyMad: true
新建dogController
@Controller public class DogController { @Autowired private dog dog; @RequestMapping("/dog") public void printDog() { System.out.println(dog); } }
启动测试
![]()
4.@ConfigurationProperties的JSR303数据校验
首先添加依赖
<!--数据校验的依赖--> <!-- Spring Boot Validator依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <!-- Hibernate Validator实现 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.13.Final</version> </dependency>
在person实体类添加注解
@Min(18)//数据校验 设置最小年龄为18 private Integer age;
yml
server: port: 8085 person: id: 1 name: "张三" address: "河北省" boss: true age: 17 birth: "2026/12/06" email: "2041130670@qq.com" hobby: "篮球" # 这个属性会被忽略,因为在 Person 类中没有对应字段
实体类里设置的最小年龄为18,yml里写的是17所以启动报错

说明验证成功
5.@ConfigurationProperties的复杂封装
所谓复杂封装,就是字段的嵌套,我们在之前的address字段里嵌套street,city,posstalCode字段
新建address实体类
@Component @ConfigurationProperties(prefix = "person.address") public class address { private String street; private String city; private String postalCode;
目的是被springboot识别
@Component @ConfigurationProperties(prefix = "person.address")
将person实体类的address改成下面,意思为引用address类,所以这就是为啥上面要prefix = "person.address",这是在person类里引用了address类
private address address;
yml配置:
server: port: 8085 person: id: 1 name: "张三" address: street: "河北省" city: "石家庄" postalCode: "050000" boss: true age: 20 birth: "2026/12/06" email: "2041130670@qq.com" hobby: "篮球" # 这个属性会被忽略,因为在 Person 类中没有对应字段 friends: - "李四" - "王五" - "赵六"
启动测试
![]()
更多推荐


所有评论(0)