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

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

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

