上次在博客中分享到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.