Spring中的@Value注解詳解
概述
本文配置文件為yml文件
在使用spring框架的項目中,@Value是經(jīng)常使用的注解之一。其功能是將與配置文件中的鍵對應(yīng)的值分配給其帶注解的屬性。在日常使用中,我們常用的功能相對簡單。本文使您系統(tǒng)地了解@Value的用法。
@Value 注解可以用來將外部的值動態(tài)注入到 Bean 中,在 @Value 注解中,可以使${} 與 #{} ,它們的區(qū)別如下:
(1)@Value(“${}”):可以獲取對應(yīng)屬性文件中定義的屬性值。
(2)@Value(“#{}”):表示 SpEl 表達式通常用來獲取 bean 的屬性,或者調(diào)用 bean 的某個方法。
使用方式
根據(jù)注入的內(nèi)容來源,@ Value屬性注入功能可以分為兩種:通過配置文件進行屬性注入和通過非配置文件進行屬性注入。
非配置文件注入的類型如下:
- 注入普通字符串
- 注入操作系統(tǒng)屬性
- 注入表達式結(jié)果
- 注入其他bean屬性
- 注入URL資源
基于配置文件的注入
首先,讓我們看一下配置文件中的數(shù)據(jù)注入,無論它是默認(rèn)加載的application.yml還是自定義my.yml文檔(需要@PropertySource額外加載)。
application.yml文件配置,獲得里面配置的端口號
程序源代碼
package cn.wideth.controller;
import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {
/**
*Get in application.yml
*/
@Value("${server.port}")
private String port;
@Test
public void getPort(){
System.out.println(port);
}
}
程序結(jié)果
自定義yml文件,application-config.yml文件配置,獲得里面配置的用戶密碼值
注意,如果想導(dǎo)入自定義的yml配置文件,應(yīng)該首先把自定義文件在application.yml文件中進行注冊,自定義的yml文件要以application開頭,形式為application-fileName
配置信息
測試程序
package cn.wideth.controller;
import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {
/**
*Get in application-config.yml
*/
@Value("${user.password}")
private String password;
@Test
public void getPassword(){
System.out.println(password);
}
}
程序結(jié)果
基于配置文件一次注入多個值
配置信息
測試程序
package cn.wideth.controller;
import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {
/**
*Injection array (automatically split according to ",")
*/
@Value("${tools}")
private String[] toolArray;
/**
*Injection list form (automatic segmentation based on "," and)
*/
@Value("${tools}")
private List<String> toolList;
@Test
public void getTools(){
System.out.println(toolArray);
System.out.println(toolList);
}
}
程序結(jié)果
基于非配置文件的注入
在使用示例說明基于非配置文件注入屬性的實例之前,讓我們看一下SpEl。
Spring Expression Language是Spring表達式語言,可以在運行時查詢和操作數(shù)據(jù)。使用#{…}作為操作符號,大括號中的所有字符均視為SpEl。
讓我們看一下特定實例場景的應(yīng)用:
注入普通字符串
測試程序
package cn.wideth.controller;
import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {
// 直接將字符串賦值給 str 屬性
@Value("hello world")
private String str;
@Test
public void getValue(){
System.out.println(str);
}
}
程序結(jié)果
注入操作系統(tǒng)屬性
可以利用 @Value 注入操作系統(tǒng)屬性。
測試程序
package cn.wideth.controller;
import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {
@Value("#{systemProperties['os.name']}")
private String osName; // 結(jié)果:Windows 10
@Test
public void getValue(){
System.out.println(osName);
}
}
程序結(jié)果
注入表達式結(jié)果
在 @Value 中,允許我們使用表達式,然后自動計算表達式的結(jié)果。將結(jié)果復(fù)制給指定的變量。如下
測試程序
package cn.wideth.controller;
import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {
// 生成一個隨機數(shù)
@Value("#{ T(java.lang.Math).random() * 1000.0 }")
private double randomNumber;
@Test
public void getValue(){
System.out.println(randomNumber);
}
}
程序結(jié)果
注入其他bean屬性
其他Bean
package cn.wideth.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//其他bean,自定義名稱為 myBeans
@Component("myBeans")
public class OtherBean {
@Value("OtherBean的NAME屬性")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
測試程序
package cn.wideth.controller;
import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {
@Value("#{myBeans.name}")
private String fromAnotherBean;
@Test
public void getValue(){
System.out.println(fromAnotherBean);
}
}
程序結(jié)果
注入URL資源
測試程序
package cn.wideth.controller;
import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import java.net.URL;
@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {
/**
*注入 URL 資源
*/
@Value("https://www.baidu.com/")
private URL homePage;
@Test
public void getValue(){
System.out.println(homePage);
}
}
程序結(jié)果文章來源:http://www.zghlxwxcb.cn/news/detail-458141.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-458141.html
到了這里,關(guān)于Spring中的@Value注解詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!