@Value和@ConfigurationProperties:

@Value注解与@ConfigurationProperties都是对对象属性进行注入配置的注解。

@Value注解:

//源码:
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Value {String value();
}
  1. @Value注解是spring框架的注解,用于对对象属性的注入。
  2. @Value注解只有一个value属性,值可以是字面量,#{SPEL}表达式,配置文件的${key}值等。
  3. 能作用在方法(一般是setter方法)、属性、参数、注解上。但是一般会在方法或者属性上使用该注解。
    使用方法:
@ToString
@Component
public class Student {//字面量,作用在成员变量里面@Value(value = "张三")private String name;//SPEL表达式@Value(value = "#{5+6}")private int age;//引用外部配置文件的属性值@Value("${student.sex}")private boolean sex;private String fatherName;private String motherName;private String teacherName;//作用在setter方法上@Value(value = "李四")public void setFatherName(String fatherName){this.fatherName = fatherName;}//理论上@Value注解应该使用在setter方法上,例如上面的setFatherName,但是也可以作用在下面方法,把motherName和teacherName属性也复制成value的值@Value(value = "王五")public void setMAndT(String motherName,String teacherName){this.motherName = motherName;this.teacherName = teacherName;}}

配置文件配置:

student: sex: true

测试类:

@SpringBootTest
class SpringbootstudyApplicationTests {@Autowiredprivate Student student;@Testvoid test1() {System.out.println(student);}}//执行结果:
//Student(name=张三, age=11, sex=true, fatherName=李四, motherName=王五, teacherName=王五)

@ConfigurationProperties注解:

//源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ConfigurationProperties {@AliasFor("prefix")String value() default "";@AliasFor("value")String prefix() default "";boolean ignoreInvalidFields() default false;boolean ignoreUnknownFields() default true;
}
  1. @ConfigurationProperties注解是spring boot的注解,用于配置文件对对象属性的配置。
  2. 不支持字面量,也不支持SPEL表达式。
  3. 从上面源码可知,该注解能作用在类和方法上。
  4. 有四个属性:
    a)prefix:配置文件key的前缀,给属性进行值的注入时会加上此前缀,例如设为teacher,然后属性值为name,name就会把配置文件中的key为teacher.name的值进行注入。
    b)value:与prefix一样的作用。与prefix不能同时设置,除非设置的值一样。
    c)ignoreInvalidFields:是否忽略无效的字段,默认不忽略。
    d)ignoreUnknownFields:是否忽略未知字段,默认忽略。

prefix与value的值不能有大写字母,不能下划线,可以中划线,不然会非法字符报错。

ignoreInvalidFields演示:

@Setter
@ToString
@Component
@ConfigurationProperties(prefix = "pet")
public class Pet {private String name;private boolean sex;
}
pet:name: 旺财sex: 女master: 张三

测试代码:

@SpringBootTest
class SpringbootstudyApplicationTests {@Autowiredprivate Pet pet;@Testvoid test() {System.out.println(pet);}
}

结果:

分析:因为ignoreInvalidFields是是否忽略无效字段,默认false不忽略,所以,Pet类中的sex属性是布尔类型,而配置文件中的该字段是字符串String类型,所以会抛出异常。

也可以设置为true,忽略无效字段:
结果为:

分析:sex字段因为无效被忽略了,使用默认值。

ignoreUnknownFields字段演示:

@Setter
@ToString
@Component
@ConfigurationProperties(prefix = "pet",ignoreUnknownFields = false)
public class Pet {private String name;private boolean sex;
}
pet:name: 旺财sex: truemaster: 张三

测试代码:

@SpringBootTest
class SpringbootstudyApplicationTests {@Autowiredprivate Pet pet;@Testvoid test() {System.out.println(pet);}
}

结果:

Caused by: org.springframework.boot.context.properties.bind.UnboundConfigurationPropertiesException: The elements [pet.master] were left unbound.//意思是配置文件中的pet.master在类用没有属性跟他绑定报错

分析:
ignoreUnknownFields的意思是是否忽略未知字段,默认是,所以默认情况下是不会报错,但是我设置为false之后,由于配置文件中有pet.master属性,但是类没有该属性,然后配置为不忽略未知字段,所以报错。

@ConfigurationProperties注解还支持JSR303数据校验:

@Setter
@ToString
@Component
@ConfigurationProperties(prefix = "pet")
@Validated
public class Pet {@Email //对name进行邮箱校验private String name;private boolean sex;
}
pet:name: 旺财sex: true
@SpringBootTest
class SpringbootstudyApplicationTests {@Autowiredprivate Pet pet;@Testvoid test() {System.out.println(pet);}
}

结果:

Field error in object 'pet' on field 'name': rejected value [旺财]; codes [Email.pet.name,Email.name,Email.java.lang.String,Email]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [pet.name,name]; arguments []; default message [name],[Ljavax.validation.constraints.Pattern$Flag;@48bfb884,.*]; default message [不是一个合法的电子邮件地址]; origin class path resource [application.yml]:6:9//因为pet.name不是邮箱格式,所以数据校验生效报错了。

支持松散绑定:
属性名匹配:

  1. teacher.schoolName.
  2. teacher.school_name
  3. teacher.school-name
  4. TEACHER.SCHOOLNAME 等等
    大小写不敏感,如果大小写不敏感之后有多个相同的属性,则只对第一个进行注入。以上可以互相配置使用。

例子:

@Component
@Data
@ConfigurationProperties(prefix = "person.configuration")
public class Person {private String firstName;private String last_name;private String BORN_LOCATION;
}
PERSON:configuRation:first-name: 乔丹LASTNAME: 迈克尔born_locAtion: 纽约

测试代码:

@SpringBootTest
class SpringbootstudyApplicationTests {@AutowiredPerson person;@Testvoid test() {System.out.println(person);}}//结果:
//Person(firstName=乔丹, last_name=迈克尔, BORN_LOCATION=纽约)  都能注入

区别总结:

比较项 @Value @ConfigurationProperties
使用方式 能够批量地注入配置文件中的属性 需要一个个指定
所属框架 Spring Spring Boot
SPEL 支持 不支持
JSR303数据校验 不支持 支持
松散绑定 不支持 支持
复杂类型绑定 不支持 支持

关于@ConfigurationProperties的复杂类型的绑定的例子可以看博主的另一篇文章:
Spring Boot application.yml文件语法

使用场景:

  1. 如果要对对象尤其是复杂对象进行配置的话推荐使用@ConfigurationProperties。
  2. 如果要对注入数据进行校验的话推荐使用@ConfigurationProperties。
  3. 如果我们只是在某个业务逻辑中需要用到配置文件的某一个值,推荐使用@Value。
  4. 如果需要用到SPEL表达式的话推荐使用@Value。
  5. 如果是spring的项目那就只能是@Value。

@Value与@ConfigurationProperties注解的讲解与区别相关推荐

  1. Spring Boot 关于 @EnableConfigurationProperties 注解 —— 使用 @ConfigurationProperties 注解的类生效。

    先说作用: @EnableConfigurationProperties注解的作用是:使用 @ConfigurationProperties 注解的类生效. 说明: 如果一个配置类只配置@Config ...

  2. @ConfigurationProperties注解的使用与@Value的使用

    读取的配置文件application.yml: jianshu:id: futaosmile 1. 使用@ConfigurationProperties注解注入 @RunWith(SpringRunn ...

  3. 在Spring Boot中使用 @ConfigurationProperties 注解

    @ConfigurationProperties根据类型校验和管理application中的bean. Spring Boot 使用一些松的规则来绑定属性到@ConfigurationProperti ...

  4. @Value@PropertySource@ConfigurationProperties注解使用

    使用配置文件注入属性 Spring Boot 默认的配置文件src/main/java/resources/application.properties或者src/main/java/resource ...

  5. @EnableConfigurationProperties 注解和@ConfigurationProperties注解实现配置绑定

    ConfigurationProperties注解主要用来把properties配置文件转化为bean来使用的,而@EnableConfigurationProperties注解的作用是@Config ...

  6. SpringBoot:@ConfigurationProperties注解使用与源码

    文章目录 1.美图 2.概述 2.1 源码 3.猜想 4.@SpringBootApplication 5.@EnableAutoConfiguration 1.美图 2.概述 我们在使用Spring ...

  7. @ConfigurationProperties注解使用

    1.基本简介 @ConfigurationProperties注解用于自动配置绑定,可以将application.properties配置中的值注入到bean对象上. 该注解使用必须将对象注入到IOC ...

  8. SpringBoot——@ConfigurationProperties注解

    @ConfigurationProperties注解(将配置文件中的配置,以属性的形式自动注入到实体中)可以注入在application.properties配置文件中的属性,和@Bean 或者 @C ...

  9. 【SpringBoot】SpringBoot @ConfigurationProperties 注解 用法与加载static静态属性

    @ConfigurationProperties [SpringBoot]SpringBoot @ConfigurationProperties 注解 用法与加载static静态属性 @Configu ...

最新文章

  1. java正则表达式的使用_java正则表达式使用
  2. [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ...
  3. 有道精品课python-有道精品课-Python小咖养成计划
  4. Flex手机开发-退出应用程序
  5. CodeForces - 510E Fox And Dinner(最大流+奇偶建边+路径打印)
  6. 手工代付系统/api代付系统/代付系统源码
  7. android内容提供器读取图片,android实现拍照或从相册选取图片
  8. python安全性_关于python安全性的问题
  9. python:批量修改文件夹下所有图片名字,改为文件夹名字的一部分+.jpg
  10. Python 万能代码模版:爬虫代码篇
  11. docx4j linux上文件内容乱码问题
  12. unity中实现多人联机局域网-基于pun v2 + photon server v5
  13. 数织游戏中的程序思维和数织的程序解法
  14. android 手机内存64实际不到,手机拥有64G,为何用了不到1G,就显示内存不足?是谁在搞鬼?...
  15. C# dataGridView控件单元格底色 dataGridView背景色 背景色调整 Header背景色前景色
  16. python疫情监控(爬虫+可视化)
  17. html如何设置ie6兼容性视图,IE6浏览器兼容性视图设置在哪里
  18. Android OKHttp 拦截器
  19. 吡啶及吡啶衍生物废水处理
  20. 【Kafka从成神到升仙系列 六】kafka 不能失去网络通信,就像西方不能失去耶路撒冷

热门文章

  1. Spark基础学习笔记05:搭建Spark Standalone模式的集群
  2. 无心剑中译丁尼生《乞丐少女》
  3. SSM框架笔记16:EASYUI_SSM框架西蒙购物网
  4. Go程序:演示复数类型的用法
  5. 【BZOJ1412】【codevs2351】狼和羊的故事,最小割
  6. Linux实战 | 使用Xshell连接Linux_2
  7. php 获取图片的宽高,JS怎么获取图片当前宽高
  8. 计算机启动单元,快速启动计算机系统的方法和计算机的启动系统与流程
  9. python怎么创建字符串_Python 字符串
  10. 2.2基本算法之递归和自调用函数_用栈算法递归解决汉诺塔问题