以前沃恩都是通過在資源路徑下通過配置文件的方式來將屬性值注入到某個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數據校驗 | 支持 | 不支持 |
複雜類型封裝 | 支持 | 不支持 |