欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

@ConfigurationProperties 与 @Value 对比

程序员文章站 2022-04-19 22:34:06
...

目录

本文导读

@Value 取值注入

application. yml

POJO 属性取赋值

测试 运行

@ConfigurationProperties VS @Value


本文导读

1、@Value 与 @ConfigurationProperties 都可以从全局配置文件中获取值然后注入到属性中

2、本来主要讲解两种取值以及注入值的区别

3、对于 "@ConfigurationProperties 注入值"不了解的可以参考《Spring Boot 全局配置文件》

@Value 取值注入

  1. * 以前在Spring核心配置文件beans.xml用如下配置为某个类的属性注入值
  2. * <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  3. * <property name="driverClassName" value="${jdbc.driverclass}"></property>
  4. * <property name="url" value="${jdbc.url}"></property>
  5. * <property name="username" value="root"></property>
  6. * <property name="password" value="123456"></property>
  7. * </bean>
  8. * 现在直接使用 @Value (xxx) 注解 就可以直接为某个属性注入值了,等价于上面

application. yml

1、使用 “@Value” 注解从全局配置文件 "application.yml" 取值,然后为指定的属性赋值。

![在这里插入图片描述](https://img-blog.csdn.net/20180711172916135?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdteDE5OTMzMjg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

  1. server:
  2. port: 8081
  3. user:
  4. id: 110
  5. lastName: 张三
  6. age: 110
  7. birthday: 2018/07/11
  8. colorList:
  9. - red
  10. - yellow
  11. - green
  12. cityMap: {mapK1: mapV1,mapK2: mapV2}
  13. dog:
  14. id: 9527
  15. name: 哮天犬
  16. age: 100

POJO 属性取赋值

1、这里演示 @Value 获取全局配置文件 application.yml 中的值为 POJO 的属性赋值,当然后不仅限于 POJO 的属性,可以为任意类的属性赋值。(当然前提是被赋值的属性所在的类已经被 Spring 容器管理)

  1. package com.lct.wmx.damain;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * Created by Administrator on 2018/7/11 0011.
  6. * 狗 实体类
  7. *
  8. * @Component 无论是@ConfigurationProperties还是@Value注入值,都必须先使本来成为-
  9. * Spring容器中的组件,这样Spring容器才能为它DI注入值
  10. */
  11. @Component
  12. public class Dog {
  13. /**
  14. * 赋值普通的Java数据类型值
  15. */
  16. @Value("1000")
  17. private Integer id;
  18. /**
  19. * ${key}:从环境变量以及配置文件中获取值
  20. */
  21. @Value("${user.lastName}")
  22. private String name;
  23. /**
  24. * #{SpEL}:Sping 表达式语言
  25. */
  26. @Value("#{10*3}")
  27. private Integer age;
  28. public Integer getAge() {
  29. return age;
  30. }
  31. public void setAge(Integer age) {
  32. this.age = age;
  33. }
  34. public Integer getId() {
  35. return id;
  36. }
  37. public void setId(Integer id) {
  38. this.id = id;
  39. }
  40. public String getName() {
  41. return name;
  42. }
  43. public void setName(String name) {
  44. this.name = name;
  45. }
  46. @Override
  47. public String toString() {
  48. return "Dog{" +
  49. "age=" + age +
  50. ", id=" + id +
  51. ", name='" + name + '\'' +
  52. '}';
  53. }
  54. }

测试 运行

  1. package com.lct.wmx;
  2. import com.lct.wmx.damain.Dog;
  3. import com.lct.wmx.damain.User;
  4. import org.junit.Test;
  5. import org.junit.runner.RunWith;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.test.context.junit4.SpringRunner;
  8. import javax.annotation.Resource;
  9. /**
  10. * SpringBoot单元测试
  11. * 可以在测试期间很方便的类似编码一样进行自动注入等容器的功能
  12. */
  13. @RunWith(SpringRunner.class)
  14. @SpringBootTest
  15. public class HelloWorldQuickApplicationTests {
  16. /**
  17. * 因为POJO类使用了@Component注解,就是Spring一个组件,交由了Spring容器注入值
  18. * 所以使用@Autowired或者@Resource,DI注入在取值即可
  19. */
  20. @Resource
  21. private Dog dog;
  22. @Test
  23. public void contextLoads() {
  24. System.out.println("------------------------------********************--------------------------------------------");
  25. System.out.println("·······················" + dog);
  26. }
  27. }

1、在测试类中运行结果如下:

![在这里插入图片描述](https://img-blog.csdn.net/20180711180306621?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdteDE5OTMzMjg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

 

@ConfigurationProperties VS @Value

 

对比项     @ConfigurationProperties @Value
注解功能 将配置文件中的属性值批量注入类的各个属性 为类中的各个属性逐个赋值
松散绑定 支持 不支持
SpEL(Spring 表达式) 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持
     

1、两者都可以从配置文件 *.yml 与 *.properties 中获取到值;

2、如果项目中只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用 @Value 即可;

3、如果项目中专门编写了一个 JavaBean 来和配置文件进行映射,则直接使用@ConfigurationProperties即可;

4、具体要具需求而定。