赞
踩
导读:
- @Value 与 @ConfigurationProperties 都可以从全局配置文件中获取值然后注入到属性中
- 本来主要讲解两种取值以及注入值的区别
- 以前在Spring核心配置文件beans.xml用如下配置为某个类的属性注入值
- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName" value="${jdbc.driverclass}"></property>
- <property name="url" value="${jdbc.url}"></property>
- <property name="username" value="root"></property>
- <property name="password" value="123456"></property>
- </bean>
- 现在直接使用 @Value (xxx) 注解 就可以直接为某个属性注入值了,等价于上面
- server.port=8081
-
- person.name=张三
- person.age=20
- person.man=true
- person.birthday=2018/12/31
- person.colorList=red,blue,green
- person.cityMap.first=北京
- person.cityMap.secondCity=大连
- person.dog.name=汪汪
- person.dog.age=3
- package com.mycode.springboot.bean;
-
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.stereotype.Component;
-
- import java.util.Date;
- import java.util.List;
-
- /**
- * Created by Administrator on 2019/1/1.
- * 人 实体类
- *
- * @Component 无论是@ConfigurationProperties还是@Value注入值,都必须先使本类成为
- * Spring容器中的组件,这样Spring容器才能为它DI注入值
- */
- @Component
- public class Person {
-
- //赋值普通的Java数据类型值
- @Value("1001")
- private Integer id;
-
- //${key}:从环境变量以及配置文件中获取值
- @Value("${person.name}")
- private String name;
-
-
- //#{SpEL}:Spring 表达式语言
- @Value("#{11*2}")
- private Integer age;
-
-
- @Value("${person.man}")
- private Boolean man;
- @Value("${person.birthday}")
- private Date birthday;
- @Value("${person.colorList}")
- private List<String> colorList;
-
- @Override
- public String toString() {
- return "Person{" +
- "id=" + id +
- ", name='" + name + '\'' +
- ", age=" + age +
- ", man=" + man +
- ", birthday=" + birthday +
- ", colorList=" + colorList +
- '}';
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Integer getAge() {
- return age;
- }
-
- public void setAge(Integer age) {
- this.age = age;
- }
-
- public Boolean getMan() {
- return man;
- }
-
- public void setMan(Boolean man) {
- this.man = man;
- }
-
- public Date getBirthday() {
- return birthday;
- }
-
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
-
- public List<String> getColorList() {
- return colorList;
- }
-
- public void setColorList(List<String> colorList) {
- this.colorList = colorList;
- }
- }
先打开springboot的单元测试
- package com.mycode.springboot;
-
- import com.mycode.springboot.bean.Person;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.test.context.junit4.SpringRunner;
-
- /**
- * SpringBoot单元测试
- * 可以在测试期间很方便的类似编码一样进行自动注入等容器的功能
- */
-
- @RunWith(SpringRunner.class)
- @SpringBootTest
- public class SpringbootValuedemoApplicationTests {
-
- /**
- * 因为POJO类使用了@Component注解,就是Spring一个组件,交由了Spring容器注入值
- * 所以使用@Autowired或者@Resource,DI注入在取值即可
- */
- @Autowired
- private Person person;
-
- @Test
- public void contextLoads() {
- System.out.println(person);
- }
-
- }
-
对比项 | @ConfigurationProperties | @Value |
注解功能 | 将配置文件中的属性值批量注入类的各个属性 | 为类中的各个属性逐个赋值 |
松散绑定 | 支持 | 不支持 |
SpEL(Spring 表达式) | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装(例如:Map) | 支持 | 不支持 |
补充说明:
1.两者都可以从配置文件 .yml 与 .properties 中获取到值;
2.如果项目中只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value即可;
3.如果项目中专门编写了一个JavaBean来和配置文件进行映射,则直接使用@ConfigurationProperties即可;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。