SpringBoot詳解如果通過@Value注解給靜態(tài)變量注入值
最近做項目的時候,給static變量賦值, 使用 @value注解 ,結(jié)果 獲取一直為null ,
1、spring不允許/不支持把值注入到靜態(tài)變量中
2、Spring的@Value依賴注入是依賴set方法
3、set方法是普通的對象方法
4、static變量是類的屬性,static沒有set方法
前序
SpringBoot中使用@Value()只能給普通變量注入值,不能直接給靜態(tài)變量賦值
例如,application-dev.properties配置文件有如下配置:

給普通變量賦值時,直接在變量聲明之上添加@Value()注解即可,如下所示:

當(dāng)要給靜態(tài)變量注入值的時候,若是在靜態(tài)變量聲明之上直接添加@Value()注解是無效的,例如:

雖然沒有編譯和運行上的報錯,經(jīng)調(diào)試可知這種注解方式mailUsername、mailPassword、mailHost的值都是null,也就是說直接給靜態(tài)變量讀取配置文件是無效的,如下所示:

方案一
若要給靜態(tài)變量賦值,可以使用set()方法,其中需要在類上加入@Component注解,方法名(例如setMailUsername)和參數(shù)名(例如username)可以任意命名,如下所示:
調(diào)試結(jié)果如下:

@Component
public class JDConfig {
/** 轉(zhuǎn)換系統(tǒng)地址 */
public static String url;
/** 轉(zhuǎn)換系統(tǒng)應(yīng)用系統(tǒng)id */
public static String sysId;
/** 是否開啟鑒權(quán) */
public static Boolean isAuth;
/** 轉(zhuǎn)換系統(tǒng)應(yīng)用系統(tǒng)秘鑰(如開啟鑒權(quán)需要填寫) */
public static String sysKey;
@Autowired(required = false)
@Value(value="${jd.serverHost:}")
public void setUrl( String url) {
JDConfig.url = url;
}
@Autowired(required = false)
@Value(value="${contract.jd.appKey:}")
public void setSysId( String sysId) {
JDConfig.sysId = sysId;
}
@Autowired(required = false)
@Value(value="${jd.isAuth:true}")
public void setAuth(Boolean isAuth) {
JDConfig.isAuth = isAuth;
}
@Autowired(required = false)
@Value(value="${contract.jd.appSecurity:}")
public void setSysKey(String sysKey) {
JDConfig.sysKey = sysKey;
}
public String getUrl() {
return url;
}
public String getSysId() {
return sysId;
}
public Boolean getIsAuth() {
return isAuth;
}
public String getSysKey() {
return sysKey;
}
}方案二
如果你覺得@value注解麻煩??梢允褂聾ConfigurationProperties注解代替,這樣比較簡潔
- 前綴要寫合適
- 方法名(例如setOssUrl)必須和屬性保持一致,例如寫為setUrl()會注入失敗
- 類上加入@Component注解
最近的項目還有有這樣一個需求,就是類中有幾個靜態(tài)變量,初始化的時候,他們的值需要讀取一個配置文件,獲取一個code,然后用這個code拼接而成。 這個code不是靜態(tài)的變量,怎么實現(xiàn)的呢,代碼如下:
@Value("${projectCode}")
private String projectCode;
public static String COOPERATIVE_GOV_TEMPLATE_KEY ;
// 消息短信配置
public static String DEPOLY_KEY;
// 消息短信詳情配置
public static String MSG_DEPOLY_KEY;
// 過濾配置
public static String MSG_FILTER_KEY;
@PostConstruct
public void init() {
COOPERATIVE_GOV_TEMPLATE_KEY = projectCode + ":template";
DEPOLY_KEY = projectCode + ":depoly";
MSG_DEPOLY_KEY = projectCode + ":msgDepoly";
MSG_FILTER_KEY = projectCode + ":msgFilter";
}這樣當(dāng)項目啟動的時候,這幾個靜態(tài)變量就有有值了。 一定要注意這個類要被spring管理,也就是要用@Controller,@Service,@Component等注解注釋。
方案三
- 類上加入@Component注解
- @PostConstruct注解修飾的方法中進行賦值操作

使用場景
那么問題來啦!我們什么場景下需要把值注入到靜態(tài)變量?
場景一

場景二
工具類中將值注入靜態(tài)變量,就可以直接在靜態(tài)方法之中使用,我本文中遇到的正是這個場景
總結(jié)
本文中,我們從一個實際問題出發(fā),探尋了三種在springboot中靜態(tài)變量注入方案,希望對大家有所幫助。
到此這篇關(guān)于SpringBoot詳解如果通過@Value注解給靜態(tài)變量注入值的文章就介紹到這了,更多相關(guān)SpringBoot @Value內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Springboot項目中很多頁面出現(xiàn)Whitelabel Error Page(404)的問題
最近在接手的前后端項目中發(fā)現(xiàn)其默認路徑不是主機+端口(如:http://localhost:3453/)的形式,很多頁面的訪問是加了一個層級,只要訪問頁面就會出現(xiàn)Whitelabel Error Page(404),所以本文給大家提供了解決方案,需要的朋友可以參考下2024-02-02
使用HttpSessionListener監(jiān)聽器實戰(zhàn)
這篇文章主要介紹了使用HttpSessionListener監(jiān)聽器實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Springboot jar文件如何打包zip在linux環(huán)境運行
這篇文章主要介紹了Springboot jar文件如何打包zip在linux環(huán)境運行,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02
構(gòu)建SpringBoot+MyBatis+Freemarker的項目詳解
在本篇內(nèi)容里小編給大家整理的是關(guān)于構(gòu)建SpringBoot+MyBatis+Freemarker的項目的具體步驟以及實例代碼,需要的朋友們參考下。2019-06-06
Springboot?集成spring?cache緩存的解決方案
這篇文章主要介紹了Springboot?集成spring?cache緩存,使用緩存最關(guān)鍵的一點就是保證緩存與數(shù)據(jù)庫的數(shù)據(jù)一致性,本文給大家介紹最常用的緩存操作模式,對Springboot?集成spring?cache緩存操作流程感興趣的朋友一起看看吧2022-06-06

