springboot使用@value注入配置失敗的解決
springboot使用@value注入配置文件失敗
遇到的問題原因是:類中注入對(duì)象不能用static。
問題解決方向一
1、改為如圖示,去掉static
問題解決方向二
1、仍然定義靜態(tài)變量,但在其set方法上使用@Value進(jìn)行賦值
2、仍然定義靜態(tài)變量,同時(shí)定義一個(gè)普通變量,使用@Value給普通變量賦值。定義一個(gè)方法,使用@PostConstruct注解注釋方法,在這個(gè)方法里,會(huì)自動(dòng)將注入的值賦值給定義的static變量
@Value注入失敗,注入值為null的問題
今天在寫項(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并沒有導(dǎo)錯(cuò)包,@Value("${localhost-key}")也沒有寫錯(cuò),再仔細(xì)檢查了一下Utils,發(fā)現(xiàn)沒加@Component?。?!
有點(diǎn)郁悶的,趕緊把@Component加上了:
@Component public class FileUtils { @Value("${localhost-key}") private static String key; }
再一運(yùn)行,發(fā)現(xiàn)居然還是null
心里很疑惑,到底哪里出了問題,運(yùn)行沒有問題,也沒有報(bào)錯(cuò),感覺就是@Value的問題了。
一番查找資料,又問了問學(xué)校的老師,終于明白:
@Value不能直接注入值給靜態(tài)屬性,Spring 不允許(或者說不支持)把值注入到靜態(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同樣不推薦這樣去做。
問題倒是找到了,但是有沒有解決的辦法呢?又是一番尋找之后
解決辦法
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)行,果然值就賦上了。
問題解決~
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA中使用JSON進(jìn)行數(shù)據(jù)傳遞示例
本篇文章主要介紹了JAVA中使用JSON進(jìn)行數(shù)據(jù)傳遞示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01Spring MVC InitBinder驗(yàn)證方法
這篇文章主要介紹了Spring MVC InitBinder驗(yàn)證方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03如何解決SpringBoot2.x版本對(duì)Velocity模板不支持的方案
這篇文章主要介紹了如何解決SpringBoot2.x版本對(duì)Velocity模板不支持的方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12java加密MD5實(shí)現(xiàn)及密碼驗(yàn)證代碼實(shí)例
這篇文章主要介紹了java加密MD5實(shí)現(xiàn)及密碼驗(yàn)證代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Spring Boot3整合Mybatis Plus的詳細(xì)過程(數(shù)據(jù)庫(kù)為MySQL)
這篇文章主要介紹了Spring Boot3整合Mybatis Plus的詳細(xì)過程(數(shù)據(jù)庫(kù)為MySQL),本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07學(xué)習(xí)Java HashMap,看這篇就夠了
這篇文章主要介紹了Java HashMap的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07SWT(JFace)體驗(yàn)之FillLayout布局
FillLayout是非常簡(jiǎn)單的一種布局方式,它會(huì)以同樣大小對(duì)父組件中的子組件進(jìn)行布局,這些子組件將以一行或一列的形式排列。2009-06-06Mybatis不支持batchInsertOrUpdate返顯id問題
這篇文章主要介紹了Mybatis不支持batchInsertOrUpdate返顯id問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05