場景重現:
以下變量在使用時會報空指針
@Autowired
private static ReadService readService;
原因分析:
靜態變量/類變量不是對象的屬性,而是一個類的屬性,spring則是基於對象層面上的依賴注入。靜態變量不屬於對象,只屬於類,也就是說在類被加載字節碼的時候變量已經初始化了,也就是給該變量分配內存了,導致spring忽略靜態變量。
解決方案
還記得Spring注入的時候要求對象實現對應屬性的Set()
方法麼?我們可以重寫靜態變量的set方法:
private static ReadService readService;
@Autowired
public void setReadService(ReadService readService) {
Commons.readService = readService;
}
後話
遇到這個問題主要是我想做一個工具類,而這個工具類需要調用Service服務。除了解決靜態service服務無法注入,實現工具類,還有另外一種解決方案————》把靜態工具類寫成一個抽象類(不使用static方法),在需要用到的時候繼承這個抽象類。