SpringBoot-注解ConfigurationProperties和value的应用(四)

上次在博客中分享到ConfigurationProperties这个注解它的作用是:将配置文件中配置的每一个属性的值,映射到组件中也就是我们的编写的实体类嘛,它可以用我们的yaml或者properties配置文件中设置属性的值.

接下来我们先简单写一个通过ConfigurationProperties注解给我们编写的实体类设值.

编写实体类

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
 private String name;
 private  int age;
 private boolean happy;
 private Date birth;
 private Map<String,Object> maps;
 private List<Object> lists;
 private Cat cat;
... }

同时加上get,set方法和toString方法

properties配置文件

person.name=七月的风
person.age=10
person.lists=小猫,小猪,小狗
person.maps.k1=520
person.maps.k2=1314
person.happy=false
person.birth=2017/6/8
person.cat.name=猫猫
person.cat.age=3

结果:

Person{name='七月的风', age=10, happy=false, birth=Thu Jun 08 00:00:00 CST 2017, maps={k1=520, k2=1314}, lists=[小猫, 小猪, 小狗], cat=Cat{name='猫猫', age=3}}

我们可以通过注解ConfigurationProperties把配置文件中的值映射到组件中.

注解value也可以给组件中注入值,它的实现就和Spring中实体类注册一样.下面value这个设置是一样的,只不过SpringBoot对其进行了封装,现在我们只需要在需要注入的属性上加上@value就可以给实体类的属性注入值了.

<bean class="">
<property name=""  value=""></property>
</bean>

注解@value注入值:

@Component
//@ConfigurationProperties(prefix = "person")
public class Person {
    @Value("${person.name}")
 private String name;
    @Value("#{11*2}")
 private  int age;
  @Value("false")
 private boolean happy;
 private Date birth;
 private Map<String,Object> maps;
 private List<Object> lists;
 private Cat cat;
...
}

有参无参,get,set方法这里没写我们使用的时候注意加上.

运行一下:

Person{name='七月的风', age=22, happy=false, birth=null, maps=null, lists=null, cat=null}

我们可以看到值也注入了.

这里的@Value("${person.name}")     用@value("${配置文件中的属性} ")    获取配置文件中的值.

这个@Value("#{11*2}")   用#和大括号括起来的 , 这里是Spring的表达式

@Value("值")  这是我们普通的注入字符串.

@ConfigurationProperties获取值和@value获取值的区别

  @ConfigurationProperties

@value

功能   批量注入配置文件中的属性 一个一个注入
松散绑定 支持 不支持
SpEl(Spring表达式) 不支持 支持
JSR303数据校验 支持 不支持
复杂类型的封装 支持 不支持

那么时候用@ConfigurationProperties什么时候用@value呢?

如果我们在某个逻辑业务中只想获取一下某个属性的值,就用@value.

如果我们专门编写一个pojo实例类和配置文件映射就用@ConfigurationProperties.