以前沃恩都是通过在资源路径下通过配置文件的方式来将属性值注入到某个javabean中。
例如:
* 通过Spring核心配置文件beans.xml用如下配置为具体的javabean的属性注入值
* <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) 注解 就可以直接为某个属性注入值了,等价于上面。这与前文使用@Configuration来讲配置文件中的属性值注入到容器中作用相同。本文将讨论使用@Value注解来达到相同的功能。
首先,@Value的用法如下:
@Value("字面量的值")
@Value("#{key}")
@Value("${key}")
(1)@Value("字面量的值")
可以直接通过@Value将字面量的值注入到某个bean中。
(2)@Value("#{key}")
表示可以从环境变量、配置文件中获取值。
(3)@Value("${key}")
表示可以支持SpEL表达式(Spring表达式)。
举例:
配置文件:application.yaml
server:
port: 8080
person:
lastName: 张三
age: 18
cityMap: {mapK1: mapV1,mapK2: mapV2}
dog:
name: 小花
age: 8
javabean:person.java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* 实体类
*
* @Component 无论是@ConfigurationProperties还是@Value注入值,都必须先使本来成为-
* Spring容器中的组件,这样Spring容器才能为它DI注入值
*/
@Component
public class Person {
/**
* ${key}:从环境变量以及配置文件中获取值
*/
@Value("${person.lastName}")
private String name;
/**
* #{SpEL}:Sping 表达式语言
*/
@Value("#{2*4}")
private int age;
/**
* 普通字面量的值
*/
@Value("中国南京")
private String address;
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAddress(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
}
@Configurationproperties与@Value的区别
@ConfigurationProperties | @value | |
功能 | 支持批量注入配置文件中的属性 | 一个一个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |