Spring中@Value注解詳細(xì)圖文講解
Spring中的@Value注解詳解
概述
本文配置文件為yml文件
在使用spring框架的項(xiàng)目中,@Value是經(jīng)常使用的注解之一。其功能是將與配置文件中的鍵對(duì)應(yīng)的值分配給其帶注解的屬性。在日常使用中,我們常用的功能相對(duì)簡(jiǎn)單。本文使您系統(tǒng)地了解@Value的用法。
@Value 注解可以用來(lái)將外部的值動(dòng)態(tài)注入到 Bean 中,在 @Value 注解中,可以使${} 與 #{} ,它們的區(qū)別如下:
(1)@Value(“${}”):可以獲取對(duì)應(yīng)屬性文件中定義的屬性值。
(2)@Value(“#{}”):表示 SpEl 表達(dá)式通常用來(lái)獲取 bean 的屬性,或者調(diào)用 bean 的某個(gè)方法。
使用方式
根據(jù)注入的內(nèi)容來(lái)源,@ Value屬性注入功能可以分為兩種:通過(guò)配置文件進(jìn)行屬性注入和通過(guò)非配置文件進(jìn)行屬性注入。
非配置文件注入的類(lèi)型如下:
- 注入普通字符串
- 注入操作系統(tǒng)屬性
- 注入表達(dá)式結(jié)果
- 注入其他bean屬性
- 注入U(xiǎn)RL資源
基于配置文件的注入
首先,讓我們看一下配置文件中的數(shù)據(jù)注入,無(wú)論它是默認(rèn)加載的application.yml還是自定義my.yml文檔(需要@PropertySource額外加載)。
application.yml文件配置,獲得里面配置的端口號(hào)
程序源代碼
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文件配置,獲得里面配置的用戶(hù)密碼值
注意,如果想導(dǎo)入自定義的yml配置文件,應(yīng)該首先把自定義文件在application.yml文件中進(jìn)行注冊(cè),自定義的yml文件要以application開(kāi)頭,形式為application-fileName
配置信息
測(cè)試程序
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é)果
基于配置文件一次注入多個(gè)值
配置信息
測(cè)試程序
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é)果
基于非配置文件的注入
在使用示例說(shuō)明基于非配置文件注入屬性的實(shí)例之前,讓我們看一下SpEl。
Spring Expression Language是Spring表達(dá)式語(yǔ)言,可以在運(yùn)行時(shí)查詢(xún)和操作數(shù)據(jù)。使用#{…}作為操作符號(hào),大括號(hào)中的所有字符均視為SpEl。
讓我們看一下特定實(shí)例場(chǎng)景的應(yīng)用:
注入普通字符串
測(cè)試程序
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)屬性。
測(cè)試程序
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é)果
注入表達(dá)式結(jié)果
在 @Value 中,允許我們使用表達(dá)式,然后自動(dòng)計(jì)算表達(dá)式的結(jié)果。將結(jié)果復(fù)制給指定的變量。如下
測(cè)試程序
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 { // 生成一個(gè)隨機(jī)數(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,自定義名稱(chēng)為 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; } }
測(cè)試程序
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é)果
注入U(xiǎn)RL資源
測(cè)試程序
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é)果
總結(jié)
到此這篇關(guān)于Spring中@Value注解的文章就介紹到這了,更多相關(guān)Spring @Value注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
maven引入kabeja依賴(lài)的實(shí)現(xiàn)步驟
本文主要介紹了maven引入kabeja依賴(lài)的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09AndroidQ沙盒機(jī)制之分區(qū)存儲(chǔ)適配
這篇文章主要介紹了AndroidQ沙盒機(jī)制之分區(qū)存儲(chǔ)適配,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Java下載文件時(shí)文件名亂碼問(wèn)題解決辦法
我最近在開(kāi)發(fā)時(shí)遇到了文件另存為時(shí)文件名出現(xiàn)亂碼,在火狐上正常的文件名,在IE中又出現(xiàn)亂碼問(wèn)題,然后好不容易在IE下調(diào)試好了文件名亂碼問(wèn)題,在火狐下又出現(xiàn)亂碼,最后終于感覺(jué)這樣是能解決了。具體如下:2013-04-04Java根據(jù)實(shí)體生成SQL數(shù)據(jù)庫(kù)表的示例代碼
這篇文章主要來(lái)和大家分享一個(gè)Java實(shí)現(xiàn)根據(jù)實(shí)體生成SQL數(shù)據(jù)庫(kù)表的代碼,文中的實(shí)現(xiàn)代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07給JavaBean賦默認(rèn)值并且轉(zhuǎn)Json字符串的實(shí)例
這篇文章主要介紹了給JavaBean賦默認(rèn)值并且轉(zhuǎn)Json字符串的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03JAVA并發(fā)編程有界緩存的實(shí)現(xiàn)詳解
這篇文章主要介紹了JAVA并發(fā)編程有界緩存的實(shí)現(xiàn)詳解的相關(guān)資料,這里舉例說(shuō)明如何實(shí)現(xiàn),四種方法一一代碼實(shí)現(xiàn),需要的朋友可以參考下2016-12-12java的MybatisPlus調(diào)用儲(chǔ)存過(guò)程的返回?cái)?shù)據(jù)問(wèn)題
這篇文章主要介紹了java的MybatisPlus調(diào)用儲(chǔ)存過(guò)程的返回?cái)?shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12