springboot使用@value注入配置失敗的解決
springboot使用@value注入配置文件失敗
遇到的問題原因是:類中注入對象不能用static。
問題解決方向一
1、改為如圖示,去掉static
問題解決方向二
1、仍然定義靜態(tài)變量,但在其set方法上使用@Value進行賦值
2、仍然定義靜態(tài)變量,同時定義一個普通變量,使用@Value給普通變量賦值。定義一個方法,使用@PostConstruct注解注釋方法,在這個方法里,會自動將注入的值賦值給定義的static變量
@Value注入失敗,注入值為null的問題
今天在寫項目的時候,因項目里的某個key是每個人都不一樣,所以想到了在application.yml里配置,隨后使用@Value注入,不同人使用就只需要創(chuàng)建每個人的application文件就行了。
大概就是下面這樣
@Value("${localhost-key}") private static String key;
yml里:
localhost-key: abcd
結(jié)果不知道為什么,@Value注入一直為空??
很疑惑,檢查了一下@Value并沒有導(dǎo)錯包,@Value("${localhost-key}")也沒有寫錯,再仔細檢查了一下Utils,發(fā)現(xiàn)沒加@Component?。?!
有點郁悶的,趕緊把@Component加上了:
@Component public class FileUtils { @Value("${localhost-key}") private static String key; }
再一運行,發(fā)現(xiàn)居然還是null
心里很疑惑,到底哪里出了問題,運行沒有問題,也沒有報錯,感覺就是@Value的問題了。
一番查找資料,又問了問學(xué)校的老師,終于明白:
@Value不能直接注入值給靜態(tài)屬性,Spring 不允許(或者說不支持)把值注入到靜態(tài)變量中
原因如下
靜態(tài)變量是一個類的屬性,而不是對象的屬性,但是Spring的依賴注入是基于對象層面上的。
而使用靜態(tài)變量擴大了靜態(tài)方法的使用范圍,Spring是不推薦使用靜態(tài)方法的,依賴注入的目的就是想讓容器去產(chǎn)生一個對象的實例,然后在整個生命周期中使用他們。
而一旦使用靜態(tài)方法,就不會去產(chǎn)生這個類的實例,這會讓測試變得更加困難。同時也不能為一個給定的類,依靠注入方式去產(chǎn)生多個具有不同的依賴環(huán)境的實例。
這種靜態(tài)域是隱含共享的,并且是一種全局狀態(tài),Spring同樣不推薦這樣去做。
問題倒是找到了,但是有沒有解決的辦法呢?又是一番尋找之后
解決辦法
Spring支持set方法注入,我們可以利用非靜態(tài)Set方法注入靜態(tài)變量,并且使用@Value的類必須交給spring進行管理(即類上添加@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; } }
再一運行,果然值就賦上了。
問題解決~
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何解決SpringBoot2.x版本對Velocity模板不支持的方案
這篇文章主要介紹了如何解決SpringBoot2.x版本對Velocity模板不支持的方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Spring Boot3整合Mybatis Plus的詳細過程(數(shù)據(jù)庫為MySQL)
這篇文章主要介紹了Spring Boot3整合Mybatis Plus的詳細過程(數(shù)據(jù)庫為MySQL),本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-07-07Mybatis不支持batchInsertOrUpdate返顯id問題
這篇文章主要介紹了Mybatis不支持batchInsertOrUpdate返顯id問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05