應用場景
專案開發中某個功能需要抽取成方法寫成一個工具類,提供給別人使用。寫過工具類的人都知道,工具類中的方法一般都是靜態方法,可以直接使用類名點方法名呼叫,
使用很方便,比如判斷某個物件是否為空的方式Objects.equals().由於我寫的這個工具類中需要讀取配置檔案中的內容,但是常規方法注入成員變數時都不是靜態的,比
如這種方式:
@Data
@Component
public class GBaseApiConfig {
@Value("${gbase.api.prefix}")
private String gbaseApi;
}
工具類中的靜態方法直接呼叫這種方式注入的成員變數會出現空指標異常,因為Java中的語法規定靜態的方法只能呼叫靜態的方法或者是成員變數,否則會報錯如下:
想使用其他非靜態的成員變數或者是方法只能通過建立物件來呼叫,可是工具類中不可能這麼幹。於是想到如下方法
方法一
通過靜態程式碼塊來讀取、載入配置檔案中的內容,程式碼如下
先定義一個靜態的成員變數,然後在靜態程式碼塊中讀取需要的配置檔案資訊,在給靜態變數賦值。這種方式親自測試完全可用。
方法二
可是過了一段時間後,專案經理讓我們修改程式碼,原因是希望專案中的程式碼風格統一,全部都使用@Value註解注入的方式。
不久一個同事就找到一個可行的辦法,程式碼如下
實現spring中的InitializingBean介面,然後重寫afterPropertiesSet方法即可。實現方式是,先將配置檔案中的值注入到一個成員變數中,然後通過方法
afterPropertiesSet實現工具類的初始化,這樣就將配置檔案中的資訊注入到工具類中。測試可用。