SpringBoot詳解如果通過(guò)@Value注解給靜態(tài)變量注入值
最近做項(xiàng)目的時(shí)候,給static變量賦值, 使用 @value注解 ,結(jié)果 獲取一直為null ,
1、spring不允許/不支持把值注入到靜態(tài)變量中
2、Spring的@Value依賴注入是依賴set方法
3、set方法是普通的對(duì)象方法
4、static變量是類的屬性,static沒(méi)有set方法
前序
SpringBoot中使用@Value()只能給普通變量注入值,不能直接給靜態(tài)變量賦值
例如,application-dev.properties配置文件有如下配置:
給普通變量賦值時(shí),直接在變量聲明之上添加@Value()注解即可,如下所示:
當(dāng)要給靜態(tài)變量注入值的時(shí)候,若是在靜態(tài)變量聲明之上直接添加@Value()注解是無(wú)效的,例如:
雖然沒(méi)有編譯和運(yùn)行上的報(bào)錯(cuò),經(jīng)調(diào)試可知這種注解方式mailUsername、mailPassword、mailHost的值都是null,也就是說(shuō)直接給靜態(tài)變量讀取配置文件是無(wú)效的,如下所示:
方案一
若要給靜態(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; } }
方案二
如果你覺(jué)得@value注解麻煩??梢允褂聾ConfigurationProperties注解代替,這樣比較簡(jiǎn)潔
- 前綴要寫合適
- 方法名(例如setOssUrl)必須和屬性保持一致,例如寫為setUrl()會(huì)注入失敗
- 類上加入@Component注解
最近的項(xiàng)目還有有這樣一個(gè)需求,就是類中有幾個(gè)靜態(tài)變量,初始化的時(shí)候,他們的值需要讀取一個(gè)配置文件,獲取一個(gè)code,然后用這個(gè)code拼接而成。 這個(gè)code不是靜態(tài)的變量,怎么實(shí)現(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; // 過(guò)濾配置 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)項(xiàng)目啟動(dòng)的時(shí)候,這幾個(gè)靜態(tài)變量就有有值了。 一定要注意這個(gè)類要被spring管理,也就是要用@Controller,@Service,@Component等注解注釋。
方案三
- 類上加入@Component注解
- @PostConstruct注解修飾的方法中進(jìn)行賦值操作
使用場(chǎng)景
那么問(wèn)題來(lái)啦!我們什么場(chǎng)景下需要把值注入到靜態(tài)變量?
場(chǎng)景一
場(chǎng)景二
工具類中將值注入靜態(tài)變量,就可以直接在靜態(tài)方法之中使用,我本文中遇到的正是這個(gè)場(chǎng)景
總結(jié)
本文中,我們從一個(gè)實(shí)際問(wèn)題出發(fā),探尋了三種在springboot中靜態(tài)變量注入方案,希望對(duì)大家有所幫助。
到此這篇關(guān)于SpringBoot詳解如果通過(guò)@Value注解給靜態(tài)變量注入值的文章就介紹到這了,更多相關(guān)SpringBoot @Value內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用Java實(shí)現(xiàn)春聯(lián)?支持自定義字體顏色
大家好,本篇文章主要講的是用Java編寫春聯(lián)?支持自定義字體顏色,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01Java常用的數(shù)據(jù)脫敏方法(手機(jī)、郵箱、身份證號(hào))
這篇文章主要給大家介紹了關(guān)于Java常用的數(shù)據(jù)脫敏(手機(jī)、郵箱、身份證號(hào))的相關(guān)資料,信息脫敏對(duì)某些敏感信息通過(guò)脫敏規(guī)則進(jìn)行數(shù)據(jù)的變形,實(shí)現(xiàn)敏感隱私數(shù)據(jù)的可靠保護(hù),需要的朋友可以參考下2023-07-07Spring AOP的概念與實(shí)現(xiàn)過(guò)程詳解
AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,可通過(guò)運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是 Spring框架中的一個(gè)重要內(nèi)容2023-02-02Java 使用Docker時(shí)經(jīng)常遇到的五個(gè)問(wèn)題
這篇文章主要介紹了Java 使用Docker時(shí)經(jīng)常遇到的五個(gè)問(wèn)題的相關(guān)資料,需要的朋友可以參考下2016-10-10一篇文章帶你搞定 springsecurity基于數(shù)據(jù)庫(kù)的認(rèn)證(springsecurity整合mybatis)
這篇文章主要介紹了一篇文章帶你搞定 springsecurity基于數(shù)據(jù)庫(kù)的認(rèn)證(springsecurity整合mybatis),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java實(shí)現(xiàn)在Word指定位置插入分頁(yè)符
在Word插入分頁(yè)符可以在指定段落后插入,也可以在特定文本位置處插入。本文將以Java代碼來(lái)操作以上兩種文檔分頁(yè)需求,需要的可以參考一下2022-04-04Spring使用aop切面編程時(shí)要給那些類加注解的實(shí)例
在使用切面編程時(shí),通常需要為以下類或組件添加注解來(lái)標(biāo)識(shí)它們,以便 Spring 或其他切面框架能夠正確識(shí)別和處理它們,這篇文章主要介紹了Spring使用aop切面編程時(shí)要給那些類加注解,需要的朋友可以參考下2023-11-11