当前位置:   article > 正文

4-3 SpringBoot 配置文件映射JavaBean — @Value获取值和@ConfigurationProperties获取值比较...

@value+:后面是默认吗

用这个@Value注解可以不导入之前那个GAV

我们之前配置文件 绑定映射 到JavaBean的值都是用 @ConfigurationPropertie

用@Value也是可以的,它是Spring的一个注解,无论配置文件是 yml还是properties他们都能获取到值; 而且支持以下SpEL写法。

2021年10月2日 13:28:30 补充:  @value 这个注解 后面加上 : 默认值  如果找不到的话 就用默认值。。。

配置文件(properties文件):

  1. #private String lastName;
  2. #private Integer age;
  3. #private Boolean boss;
  4. #private Date birth;
  5. #private Map<String,Object> maps;
  6. #private List<Object> lists;
  7. #private Dog dog;
  8. #=============================================================
  9. #person.lastName 相等于 person.last-name【松散写法】
  10. person.last-name=BiHu
  11. person.age=18
  12. person.boss=false
  13. person.birth=2025/10/10
  14. person.maps.k1=value1
  15. person.maps.k2=value2
  16. person.lists=v1,v2,v3,v4
  17. person.dog.name=小勾勾
  18. person.dog.age=2
View Code

 JavaBean.java:

  1. package com.bihu.Bean;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.stereotype.Component;
  4. import java.util.Date;
  5. import java.util.List;
  6. import java.util.Map;
  7. @Component
  8. //@ConfigurationProperties(prefix = "person")
  9. public class JavaBean {
  10. /**
  11. * 支持下面三种写法
  12. * value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}" 下面一一演示:
  13. * */
  14. @Value("${person.last-name}") //直接字面量
  15. private String lastName;
  16. @Value("#{2*3}")
  17. private Integer age;
  18. @Value("false")
  19. private Boolean boss;
  20. private Date birth;
  21. private Map<String,Object> maps;
  22. private List<Object> lists;
  23. private Dog dog;
  24. @Override
  25. public String toString() {
  26. return "Person{" +
  27. "lastName='" + lastName + '\'' +
  28. ", age=" + age +
  29. ", boss=" + boss +
  30. ", birth=" + birth +
  31. ", maps=" + maps +
  32. ", lists=" + lists +
  33. ", dog=" + dog +
  34. '}';
  35. }
  36. public String getLastName() {
  37. return lastName;
  38. }
  39. public void setLastName(String lastName) {
  40. this.lastName = lastName;
  41. }
  42. public Integer getAge() {
  43. return age;
  44. }
  45. public void setAge(Integer age) {
  46. this.age = age;
  47. }
  48. public Boolean getBoss() {
  49. return boss;
  50. }
  51. public void setBoss(Boolean boss) {
  52. this.boss = boss;
  53. }
  54. public Date getBirth() {
  55. return birth;
  56. }
  57. public void setBirth(Date birth) {
  58. this.birth = birth;
  59. }
  60. public Map<String, Object> getMaps() {
  61. return maps;
  62. }
  63. public void setMaps(Map<String, Object> maps) {
  64. this.maps = maps;
  65. }
  66. public List<Object> getLists() {
  67. return lists;
  68. }
  69. public void setLists(List<Object> lists) {
  70. this.lists = lists;
  71. }
  72. public Dog getDog() {
  73. return dog;
  74. }
  75. public void setDog(Dog dog) {
  76. this.dog = dog;
  77. }
  78. }
View Code

里面三种写法已经展示,运行测试:

  1. package com.bihu;
  2. import com.bihu.Bean.JavaBean;
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.test.context.junit4.SpringRunner;
  8. @RunWith(SpringRunner.class) //有了@RunWith(SpringRunner.class)这些类才能实例化到spring容器中,自动注入才能生效,
  9. @SpringBootTest
  10. public class ApplicationTests {
  11. //这里测试JavaBean
  12. @Autowired
  13. JavaBean Person;
  14. @Test
  15. public void contextLoads() {
  16. System.out.println(Person);
  17. }
  18. }
View Code

结果:

Person{lastName='BiHu', age=6, boss=false, birth=null, maps=null, lists=null, dog=null}

可以看出 ,lastName是直接获取到配置文件中的数据写入,然后 age 是用 #{表达式} 直接算出注入,boss 为false 是直接字面量写入的。


@Value获取值和@ConfigurationProperties获取值比较⭐⭐⭐

@Value获取值和@ConfigurationProperties获取值比较
 @ConfigurationProperties@Value
功能批量注入配置文件中的属性一个个指定
松散绑定(松散语法)支持不支持
SpEL不支持支持
JSR303数据校验支持不支持
复杂类型封装支持不支持

1. 功能不用多说,都知道

2.松散语法: 就是驼峰用-表示,即: lastName 相当于 last-Name ,  如果配置文件是“ person.last-name=BiHu ”,如果用@Value这样写: @Value("${person.lastName}") ,会获取不了会报错,因为@Value不支持松散语法,反之如果是 @ConfigurationProperties注解来注入,就不会,因为他支持这个松散写法。

关于是否支持松散语法提示: 不用想那么多,配置文件怎么样写那就怎么样写即可...

3.spel表达式 ,其实就是 那个 “#{表达式}” 这个表达式就是 spel表达式。

4.JSR303数据校验:

JavaBean的值如果要校验,我们在JavaBean放一个@Validated 说明映射值绑定需要校验,然后我们在 某成员变量写一个注解 @Email 表示下面这个成员变量需要是邮箱格式,会校验的,如果不是则报错!

JavaBean.java:

  1. package com.bihu.Bean;
  2. import org.hibernate.validator.constraints.Email;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.boot.context.properties.ConfigurationProperties;
  5. import org.springframework.stereotype.Component;
  6. import org.springframework.validation.annotation.Validated;
  7. import java.util.Date;
  8. import java.util.List;
  9. import java.util.Map;
  10. @Component
  11. @ConfigurationProperties(prefix = "person")
  12. @Validated //这个注解说明JavaBean的值映射需要校验
  13. public class JavaBean {
  14. @Email //这个注解说明 lastName一定得邮箱数据类型
  15. private String lastName;
  16. private Integer age;
  17. private Boolean boss;
  18. private Date birth;
  19. private Map<String,Object> maps;
  20. private List<Object> lists;
  21. private Dog dog;
  22. @Override
  23. public String toString() {
  24. return "Person{" +
  25. "lastName='" + lastName + '\'' +
  26. ", age=" + age +
  27. ", boss=" + boss +
  28. ", birth=" + birth +
  29. ", maps=" + maps +
  30. ", lists=" + lists +
  31. ", dog=" + dog +
  32. '}';
  33. }
  34. public String getLastName() {
  35. return lastName;
  36. }
  37. public void setLastName(String lastName) {
  38. this.lastName = lastName;
  39. }
  40. public Integer getAge() {
  41. return age;
  42. }
  43. public void setAge(Integer age) {
  44. this.age = age;
  45. }
  46. public Boolean getBoss() {
  47. return boss;
  48. }
  49. public void setBoss(Boolean boss) {
  50. this.boss = boss;
  51. }
  52. public Date getBirth() {
  53. return birth;
  54. }
  55. public void setBirth(Date birth) {
  56. this.birth = birth;
  57. }
  58. public Map<String, Object> getMaps() {
  59. return maps;
  60. }
  61. public void setMaps(Map<String, Object> maps) {
  62. this.maps = maps;
  63. }
  64. public List<Object> getLists() {
  65. return lists;
  66. }
  67. public void setLists(List<Object> lists) {
  68. this.lists = lists;
  69. }
  70. public Dog getDog() {
  71. return dog;
  72. }
  73. public void setDog(Dog dog) {
  74. this.dog = dog;
  75. }
  76. }
View Code

配置文件(properties)

  1. #private String lastName;
  2. #private Integer age;
  3. #private Boolean boss;
  4. #private Date birth;
  5. #private Map<String,Object> maps;
  6. #private List<Object> lists;
  7. #private Dog dog;
  8. #=============================================================
  9. #person.lastName 相等于 person.last-name【松散写法】
  10. #person.last-name=bihu 报错!!!!!
  11. # person.last-name=123@qq.com 不报错!!!!因为是一个邮箱格式的写法
  12. person.age=18
  13. person.boss=false
  14. person.birth=2025/10/10
  15. person.maps.k1=value1
  16. person.maps.k2=value2
  17. person.lists=v1,v2,v3,v4
  18. person.dog.name=小勾勾
  19. person.dog.age=2
View Code

这就是JSR303数据校验。

5.复杂类型封装:

其实就是List、Map、数组和对象,@Value注解是不支持注入的,@ConfigurationProperties是支持的,例如下面注入maps的时候会报错:

  1. @Value("${person.maps}") //这样会报错!因为@Value不支持特殊数据类型 只支持基本数据类型
  2. private Map<String,Object> maps;

总结: 

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;【记住:单独需要某项值】

我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

一般都是用@ConfigurationProperties!

这就是@Value的使用 和 @Value获取值和@ConfigurationProperties获取值 不同

千万别弄混:

@Value 是有了配置文件 然后在配置文件中取某个数据注入【不需要依赖GAV】

@ConfigurationProperties 是直接在配置文件中的数据绑定过来。【需要依赖GAV】

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/496057
推荐阅读
相关标签
  

闽ICP备14008679号