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()注解是無效的,例如:
雖然沒有編譯和運(yùn)行上的報錯,經(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注解修飾的方法中進(jìn)行賦值操作
使用場景
那么問題來啦!我們什么場景下需要把值注入到靜態(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)文章
用Java實現(xiàn)春聯(lián)?支持自定義字體顏色
大家好,本篇文章主要講的是用Java編寫春聯(lián)?支持自定義字體顏色,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01Java常用的數(shù)據(jù)脫敏方法(手機(jī)、郵箱、身份證號)
這篇文章主要給大家介紹了關(guān)于Java常用的數(shù)據(jù)脫敏(手機(jī)、郵箱、身份證號)的相關(guān)資料,信息脫敏對某些敏感信息通過脫敏規(guī)則進(jìn)行數(shù)據(jù)的變形,實現(xiàn)敏感隱私數(shù)據(jù)的可靠保護(hù),需要的朋友可以參考下2023-07-07一篇文章帶你搞定 springsecurity基于數(shù)據(jù)庫的認(rèn)證(springsecurity整合mybatis)
這篇文章主要介紹了一篇文章帶你搞定 springsecurity基于數(shù)據(jù)庫的認(rèn)證(springsecurity整合mybatis),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10