springboot使用@value注入配置失敗的解決
springboot使用@value注入配置文件失敗
遇到的問(wèn)題原因是:類中注入對(duì)象不能用static。
問(wèn)題解決方向一
1、改為如圖示,去掉static

問(wèn)題解決方向二
1、仍然定義靜態(tài)變量,但在其set方法上使用@Value進(jìn)行賦值

2、仍然定義靜態(tài)變量,同時(shí)定義一個(gè)普通變量,使用@Value給普通變量賦值。定義一個(gè)方法,使用@PostConstruct注解注釋方法,在這個(gè)方法里,會(huì)自動(dòng)將注入的值賦值給定義的static變量

@Value注入失敗,注入值為null的問(wèn)題
今天在寫項(xiàng)目的時(shí)候,因項(xiàng)目里的某個(gè)key是每個(gè)人都不一樣,所以想到了在application.yml里配置,隨后使用@Value注入,不同人使用就只需要?jiǎng)?chuàng)建每個(gè)人的application文件就行了。
大概就是下面這樣
@Value("${localhost-key}")
private static String key;
yml里:
localhost-key: abcd
結(jié)果不知道為什么,@Value注入一直為空??
很疑惑,檢查了一下@Value并沒(méi)有導(dǎo)錯(cuò)包,@Value("${localhost-key}")也沒(méi)有寫錯(cuò),再仔細(xì)檢查了一下Utils,發(fā)現(xiàn)沒(méi)加@Component?。。?/p>
有點(diǎn)郁悶的,趕緊把@Component加上了:
@Component
public class FileUtils {
@Value("${localhost-key}")
private static String key;
}
再一運(yùn)行,發(fā)現(xiàn)居然還是null
心里很疑惑,到底哪里出了問(wèn)題,運(yùn)行沒(méi)有問(wèn)題,也沒(méi)有報(bào)錯(cuò),感覺就是@Value的問(wèn)題了。
一番查找資料,又問(wèn)了問(wèn)學(xué)校的老師,終于明白:
@Value不能直接注入值給靜態(tài)屬性,Spring 不允許(或者說(shuō)不支持)把值注入到靜態(tài)變量中
原因如下
靜態(tài)變量是一個(gè)類的屬性,而不是對(duì)象的屬性,但是Spring的依賴注入是基于對(duì)象層面上的。
而使用靜態(tài)變量擴(kuò)大了靜態(tài)方法的使用范圍,Spring是不推薦使用靜態(tài)方法的,依賴注入的目的就是想讓容器去產(chǎn)生一個(gè)對(duì)象的實(shí)例,然后在整個(gè)生命周期中使用他們。
而一旦使用靜態(tài)方法,就不會(huì)去產(chǎn)生這個(gè)類的實(shí)例,這會(huì)讓測(cè)試變得更加困難。同時(shí)也不能為一個(gè)給定的類,依靠注入方式去產(chǎn)生多個(gè)具有不同的依賴環(huán)境的實(shí)例。
這種靜態(tài)域是隱含共享的,并且是一種全局狀態(tài),Spring同樣不推薦這樣去做。
問(wèn)題倒是找到了,但是有沒(méi)有解決的辦法呢?又是一番尋找之后
解決辦法
Spring支持set方法注入,我們可以利用非靜態(tài)Set方法注入靜態(tài)變量,并且使用@Value的類必須交給spring進(jìn)行管理(即類上添加@Compent、@RestController、@Service…)
@Component
public class FileUtils {
private static String key;
@Value("${localhost-key}")
public void setKey(String key) { //注意這里的set方法不能是靜態(tài)的
FileUtils.key = key;
}
}
再一運(yùn)行,果然值就賦上了。
問(wèn)題解決~
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot中使用@Value注解注入詳解
- SpringBoot詳解如果通過(guò)@Value注解給靜態(tài)變量注入值
- SpringBoot的@Value給靜態(tài)變量注入application.properties屬性值
- SpringBoot通過(guò)@Value實(shí)現(xiàn)給靜態(tài)變量注入值詳解
- Springboot @Value注入boolean設(shè)置默認(rèn)值方式
- SpringBoot使用@Value實(shí)現(xiàn)給靜態(tài)變量注入值
- SpringBoot解析@Value注解型解析注入時(shí)機(jī)及原理分析
相關(guān)文章
SpringBoot集成QQ第三方登陸的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot集成QQ第三方登陸的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Spring Data JPA 設(shè)置字段默認(rèn)值方式
這篇文章主要介紹了Spring Data JPA設(shè)置字段默認(rèn)值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
深入講解java線程與synchronized關(guān)鍵字
Java 中多線程的同步依靠的是對(duì)象鎖機(jī)制,synchronized關(guān)鍵字就是利用了封裝對(duì)象鎖來(lái)實(shí)現(xiàn)對(duì)共享資源的互斥訪問(wèn)。下面這篇文章主要介紹了java線程與synchronized關(guān)鍵字的相關(guān)資料,需要的朋友可以參考下。2017-03-03
java中Servlet監(jiān)聽器的工作原理及示例詳解
這篇文章主要介紹了java中Servlet監(jiān)聽器的工作原理及示例詳解。Servlet監(jiān)聽器用于監(jiān)聽一些重要事件的發(fā)生,監(jiān)聽器對(duì)象可以在事情發(fā)生前、發(fā)生后可以做一些必要的處理。感興趣的可以來(lái)了解一下2020-07-07
SpringBoot整合thymeleaf 報(bào)錯(cuò)的解決方案
這篇文章主要介紹了SpringBoot整合thymeleaf 報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

