Spring 靜態(tài)變量/構(gòu)造函數(shù)注入失敗的解決方案
1、案例1:Spring對靜態(tài)變量的注入為空
案例代碼如下:
@Component
public class HelloWorld {
/**
* 錯誤案例:這種方式是不能給靜態(tài)變量注入屬性值的
*/
@Value("${hello.world}")
public static String HELLO_WORLD;
}
解決方案一:@Value注解加在setter方法上面
@Component
public class HelloWorld {
public static String HELLO_WORLD;
@Value("${hello.world}")
public void setHELLO_WORLD(String HELLO_WORLD) {
this.HELLO_WORLD = HELLO_WORLD;
}
}
解決方案二:@PostConstruct注解
因為@PostConstruct注解修飾的方法加在順序在構(gòu)造方法之后靜態(tài)變量賦值之前,所以可以通過該注解解決靜態(tài)變量屬性值注入失敗問題:
@Component
public class HelloWorld {
public static String HELLO_WORLD;
@Value("${hello.world}")
public static String helloWorld;
@PostConstruct
public void init(){
// 為靜態(tài)變量賦值(值為從Spring IOC容器中獲取的hello.world字段值)
HELLO_WORLD = this.helloWorld;
}
}
2、案例2:在構(gòu)造函數(shù)中使用Spring容器中的Bean對象,得到的結(jié)果為空
業(yè)務(wù)場景假設(shè):
eg:我需要在一個類(HelloWorld)被加載的時候,調(diào)用service層的接口(UserService)去執(zhí)行一個方法(sayHello),有些同學(xué)可能會在構(gòu)造函數(shù)中通過調(diào)用UserService的sayHello()去實現(xiàn)這個需求,但是這會導(dǎo)致一些錯誤異常,請看下面的示例。
錯誤演示代碼如下:
@Component
public class HelloWorld {
/**
* UserService注入
*/
@Autowired
private UserService userService;
public HelloWorld(){
// 這里會報空指針異常:因為 userService 的屬性注入是在無參數(shù)構(gòu)造函數(shù)之后,如果這里直接使用 userService ,此時該屬性值為null,一個為null的成員變量調(diào)用sayHello()方法,NullPointException 異常是情理之中呀!
userService.sayHello("hello tiandai!");
}
}
解決方案:@PostConstruct注解
由于@PostConstruct注解修飾的方法其生命周期位于構(gòu)造方法調(diào)用之后,在Spring屬性值注入之前,所以,該注解可以很好的解決這個業(yè)務(wù)需求,代碼如下:
@Component
public class HelloWorld {
/**
* UserService注入
*/
@Autowired
private UserService userService;
public HelloWorld(){
}
@PostConstruct
public void init(){
userService.sayHello("hello tiandai!");
}
}
補充
關(guān)于這一部分問題,還有一些奇奇怪怪的用法
在構(gòu)造函數(shù)里使用@Value注入的屬性值獲取不到
在配置mqtt連接的時候是在bean初始化的時候就進(jìn)行連接, 所以要配置連接參數(shù), 當(dāng)時用的是這樣的方式.

結(jié)果運行的時候一直會報NullPointer異常,網(wǎng)上找了很多方案都沒效果,? 后來發(fā)現(xiàn) controller里是可以注入成功的,? 那么說明依賴注入是在構(gòu)造函數(shù)之后進(jìn)行的.? ? ?用以下方式可解決.

還有一點 , @Value 屬性是不可以static修飾的,否則也取不到值。
到此這篇關(guān)于Spring 靜態(tài)變量/構(gòu)造函數(shù)注入失敗的解決方案的文章就介紹到這了,更多相關(guān)Spring 靜態(tài)變量 構(gòu)造函數(shù)注入失敗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Json轉(zhuǎn)list二層解析轉(zhuǎn)換代碼實例
這篇文章主要介紹了Json轉(zhuǎn)list二層解析轉(zhuǎn)換代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-12-12
Nacos1.4.0 Windows10單機(jī)模式啟動和集群啟動過程解析
這篇文章主要介紹了Nacos1.4.0 Windows10單機(jī)模式啟動和集群啟動,第一次使用nacos,廢話不多說,記錄下自己啟動Nacos遇到的坑,感興趣的朋友跟隨小編一起看看吧2023-10-10
淺談spring-boot 允許接口跨域并實現(xiàn)攔截(CORS)
本篇文章主要介紹了淺談spring-boot 允許接口跨域并實現(xiàn)攔截(CORS),具有一定的參考價值,有興趣的可以了解一下2017-08-08
SpringBoot實現(xiàn)動態(tài)數(shù)據(jù)源切換的方法總結(jié)
項目開發(fā)中經(jīng)常會遇到多數(shù)據(jù)源同時使用的場景,比如冷熱數(shù)據(jù)的查詢等情況,所以接下來本文就來介紹一下如何使用實現(xiàn)自定義注解的形式來實現(xiàn)動態(tài)數(shù)據(jù)源切換吧2023-12-12
centos7如何通過systemctl啟動springboot服務(wù)代替java -jar方式啟動
這篇文章主要介紹了centos7如何通過systemctl啟動springboot服務(wù)代替java -jar方式啟動,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01
Spring?Boot自定義Starter組件開發(fā)實現(xiàn)配置過程
SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)?starter,應(yīng)用者只需要在maven中引入starter依賴,這篇文章主要介紹了Spring?Boot自定義Starter組件開發(fā)實現(xiàn),需要的朋友可以參考下2022-06-06

