@ConfigurationProperties与@Value区别

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@ConfigurationProperties与@Value区别相关的知识,希望对你有一定的参考价值。

文章目录

@ConfigurationProperties与@Value区别

使用位置

  • @ConfigurationProperties:标注在JavaBean的类名上;
  • @Value:标注在JavaBean的属性上。

@ConfigurationProperties位置如下:


@Value位置如下:

二者功能不同

@ConfigurationProperties是可以批量注入的,一次搞定,而@Value只能一个一个注入,

如下:

//@Value:注意一个容器已经存在的对象  @Value("$student.student-name")
@Value("$student.student-name")
private String studentName;
@Value("$student.age")
private Integer age;
@Value("true")
private Boolean sex;//男代表true

但是我们使用@ConfigurationProperties就配置一行就完事了:

// 读取主配置文件中的数据,赋值给student对象
// prefix: 需要属性,指定主配置文件中的数据
@ConfigurationProperties(prefix = "student") 
public class Student 
	private String studentName;
	private Integer age;
	private Boolean sex;//男代表true

松散绑定

PS:什么是松散绑定????

松散绑定是springboot在使用 @EnableConfigurationProperties 注解里面提出来的,也就是说在application.yml文件中,可以不那么严格的去命名变量名。

松散语法属性名匹配规则是这样的:

  • studentName:使用标准驼峰方式
  • student-name:一般小写用-
  • STUDENT_NAME:一般大写用_

比如说ipaddress可以在配置文件中有多种出线形势,但是在代码里面还是要以驼峰命名。

ipAddress: 192.168.0.1  // 驼峰命名
ipaddress: 192.168.0.1  // 
ip_Address: 192.168.0.1  // 下划线命名
ip-address: 192.168.0.1 // -线命名

在代码中:

@Component
@ConfigurationProperties(prefix = "servers")
public class ServerConfig 
    private String ipAddress;

PS结束了

@ConfigurationProperties支持松散绑定studentName可以写为student-name都没有问题。而@Value不可以。@Value进行绑定时,名称只能与application.properties中属性的名称相同

SpEL

@ConfigurationProperties不支持SpEL,比如:

properties中配置

#配置student
student.student-name=jack
student.age=#18+5   //这里是直接报错
student.sex=true

Yml文件配置不支持SpEL

student:
  student-name: rose@qq.com
  age: #18+8    #不会报错,但是不能注入到student的age中
  sex: false

@Value支持SpEL。比如:

@Value("#18+8")
private Integer age;

Age是可以正常注入的。

复杂类型封装

@ConfigurationProperties支持复杂类型封装
@Value不支持复杂类型,只支持字符串,和基本数据类型及其包装类。

总结

区别@ConfigurationProperties@Value
位置类名上属性上
功能批量注入属性文件中的属性一个个的指定
松散绑定(松散语法)支持不支持
SpEL不支持支持
JSR303数据校验支持不支持
复制类型封装支持不支持

以上是关于@ConfigurationProperties与@Value区别的主要内容,如果未能解决你的问题,请参考以下文章

如何将@ConfigurationProperties 与记录一起使用?

SpringBoot 配置 @ConfigurationProperties 与 @Value 区别

5.@ConfigurationProperties与@Value的区别

如何仅使用@DateTimeFormat 将日期@ConfigurationProperties 与时间绑定?

与 @ConfigurationProperties 一起使用的自定义基于 XML 的属性源加载器

@ConfigurationProperties