@Value和@ConfigurationProperties注入调集、Map、数组特点值

后端的开发中,只要是运用spring或者springboot,那么基本上就离不开@Value@ConfigurationProperties这两个注解,他们都是用来给咱们特点赋值的,@Value 是给单个特点赋值,@ConfigurationProperties 是给多个特点赋值。简略的特点赋值就不说了,今天来看下,关于数组,调集,Map类型的特点,该要怎么赋值。

1. @Value 注入数组

@Component
public class Person {  
    @Value("${person.hobbies}")  
    private String[] hobbies;  
}

装备文件:

person:
  #注意:要用逗号分隔,假如用其他符号分隔就会被识别为一个元素。
  hobbies: basketball,football,swimming  #注意:在nacos装备时逗号前后不要有空格

2. @Value 注入调集

@Component
public class Person {  
    @Value("${person.hobbies}")  
    private Collection<String> hobbies;   
}

装备文件:

#和数组的写法一样,同样也要用逗号分隔。假如用其他分隔符,能够凭借SPEL来解析
person:  
  hobbies: basketball,football,swimming,signing
#这种写法@Value不能解析,@ConfigurationProperties注解能够
person:  
  hobbies:  
    - basketball  
    - football  
    - swimming

假如将分隔符换成#,那么需要凭借SPEL来解析成数组或者调集。

@Component
public class Person {  
    @Value("#{'${person.hobbies}'.split('#')}")  
    private String[] hobbies2;  
    @Value("#{'${person.hobbies}'.split('#')}")  
    private Collection<String> hobbies;
}

3. @Value 注入Map

@Component
public class Person {  
    //凭借SPEL表达式
    @Value("#{${person.courses}}")  
    Map<String, String> courses;
}

装备文件:

person:
  #JSON写法
  courses: "{english: 'A', math: 'B', physics: '不合格'}"
#这种格式@Value无法解析,@ConfigurationProperties注解能够
person:  
  courses:  
    english: 'A'  
    math: 'B'  
    physics: '不合格'  

趁便提一下,@Value 注入假如找不到对应的装备,则会报错,假如不想报错,能够给一个默认值,用:分隔。

  //默认值是zhangsan
  @Value("${person.name:zhangsan}")
  private String name;
  //默认值是空串""
  @Value("${person.name:}")
  private String name;

4. @ConfigurationProperties注入数组

@Data
@ConfigurationProperties(prefix = "person")  
@Component  
public class Person {  
  private String[] nickNames;
}

装备文件:

person:
  nick-names:  #用nickeNames也能够,支撑松懈绑定
    - 阿呆  
    - 吴彦祖
#还能够行内写法:
person:  
  nick-names: [阿呆,彦祖,冠希]

5. @ConfigurationProperties注入调集

和注入数组是如出一辙的。

6. @ConfigurationProperties注入Map

@Data
@ConfigurationProperties(prefix = "person")  
@Component  
public class Person {  
   private Map<String, String> courses;
}

装备文件:

person:
  courses:  
    english: '及格'  
    math: '优异'  
    chinese: '满分'
#还能够行内写法
person: 
  #@Value注入Map时和这个很像,可是@Value需要用引号括起来,可是这儿不能括起来
  courses: { english: 及格, math: 优异, chinese: 满分2 }

汇总一下:

@Data
@ConfigurationProperties(prefix = "person")  
@Component  
public class Person implements InitializingBean {  
    //数组  
    private String[] nickNames;  
    //调集  
    private Collection<String> hobbies;  
    //Map  
    private Map<String, String> courses;  
    //其他类  
    private Car car;  
    @Override  
    public void afterPropertiesSet() throws Exception {  
        System.out.println("nickNames = " + Arrays.toString(nickNames));  
        System.out.println("hobbies = " + hobbies);  
        System.out.println("courses = " + courses);  
        System.out.println("car = " + car);  
    }  
}

装备文件:

person:
  nick-names:  
    - 阿呆  
    - 吴彦祖  
  hobbies: [basketball, football, swimming]  
  courses:  
    english: '及格'  
    math: '优异'  
    chinese: '满分'  
  car:  
    brand: 奥迪  
    price: 300000.00

简略看下@Value@ConfigurationProperties注解的差异

@ConfigurationProperties @Value
特点 批量注入装备文件中的特点 单个指定
SPEL功用 不支撑 支撑
松懈绑定 支撑 不支撑
杂乱类型封装 支撑 不支撑
JSR303校验 支撑 不支撑

好了,关于@Value@ConfigurationProperties注解注入杂乱类型的特点就介绍到这儿吧,欢迎我们弥补。