spring 注入 static 成員變數
阿新 • • 發佈:2019-01-02
先上工具程式碼
import org.springframework.beans.factory.annotation.Autowired; import com.ssh.dao.RedisServer; public class RedisUtil { @Autowired private static RedisServer redisServer; public static <T> void put(String key, T obj) { redisServer.put(key, obj); } public static <T> void put(String key, T obj, int timeout) { redisServer.put(key, obj,timeout); } public static <T> T get(String key, Class<T> cls) { return redisServer.get(key,cls); } public static <T> String get(String key) { return redisServer.get(key); } }
當我們呼叫
RedisUtil.put(obj,obj);
就會報空指標,原因是因為靜態變數不屬於物件,只屬於類,也就是說在類被載入位元組碼的時候變數已經初始化了,也就是給該變數分配記憶體了,導致spring忽略靜態變數,在呼叫靜態變數時就會報空指標。
解決辦法:
使用 @Component 將redisUtil 註冊為元件,建立需要注入的非靜態成員變數,再使用 @PostConstruct 等待初始化完成後將注入的成員變數賦值給靜態成員變數
下面貼程式碼
import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.ssh.dao.RedisServer; @Component public class RedisUtil { @Autowired private RedisServer redisServerTemp; private static RedisServer redisServer; private static RedisUtil redisUtilTemp; @PostConstruct public void init(){ redisUtilTemp = this; redisServer =this.redisServerTemp; } public static <T> void put(String key, T obj) { redisServer.put(key, obj); } public static <T> void put(String key, T obj, int timeout) { redisServer.put(key, obj,timeout); } public static <T> T get(String key, Class<T> cls) { return redisServer.get(key,cls); } public static <T> String get(String key) { return redisServer.get(key); } }