本文为转载,原文地址:地址
本文导读
- @Value 与 @ConfigurationProperties 都可以从全局配置文件中获取值然后注入到属性中
- 本来主要讲解两种取值以及注入值的区别
- 对于 "@ConfigurationProperties 注入值"不了解的可以参考《Spring Boot 全局配置文件》
@Value 取值注入
* 以前在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) 注解 就可以直接为某个属性注入值了,等价于上面
application. yml
- 后面会使用“@Value”从"application.yml"配置文件中取值

server:
port: 8081
user:
id: 110
lastName: 张三
age: 110
birthday: 2018/07/11
colorList:
- red
- yellow
- green
cityMap: {mapK1: mapV1,mapK2: mapV2}
dog:
id: 9527
name: 哮天犬
age: 100
POJO 属性取赋值
package com.lct.wmx.damain;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* Created by Administrator on 2018/7/11 0011.
* 狗 实体类
*
* @Component 无论是@ConfigurationProperties还是@Value注入值,都必须先使本来成为-
* Spring容器中的组件,这样Spring容器才能为它DI注入值
*/
@Component
public class Dog {
/**
* 赋值普通的Java数据类型值
*/
@Value("1000")
private Integer id;
/**
* ${key}:从环境变量以及配置文件中获取值
*/
@Value("${user.lastName}")
private String name;
/**
* #{SpEL}:Sping 表达式语言
*/
@Value("#{10*3}")
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
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;
}
@Override
public String toString() {
return "Dog{" +
"age=" + age +
", id=" + id +
", name='" + name + '\'' +
'}';
}
}
测试 运行
package com.lct.wmx;
import com.lct.wmx.damain.Dog;
import com.lct.wmx.damain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
/**
* SpringBoot单元测试
* 可以在测试期间很方便的类似编码一样进行自动注入等容器的功能
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloWorldQuickApplicationTests {
/**
* 因为POJO类使用了@Component注解,就是Spring一个组件,交由了Spring容器注入值
* 所以使用@Autowired或者@Resource,DI注入在取值即可
*/
@Resource
private Dog dog;
@Test
public void contextLoads() {
System.out.println("------------------------------********************--------------------------------------------");
System.out.println("·······················" + dog);
}
}

区别总览表
| 对比项 |
@ConfigurationProperties |
@Value |
| 注解功能 |
将配置文件中的属性值批量注入类的各个属性 |
为类中的各个属性逐个赋值 |
| 松散绑定 |
支持 |
不支持 |
| SpEL(Spring 表达式) |
不支持 |
支持 |
| JSR303数据校验 |
支持 |
不支持 |
| 复杂类型封装 |
支持 |
不支持 |
| |
|
|
- 两者都可以从配置文件 .yml 与 .properties 中获取到值;
- 如果项目中只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value即可;
- 如果项目中专门编写了一个JavaBean来和配置文件进行映射,则直接使用@ConfigurationProperties即可;