Spring @Autowired註解在非Controller中注入爲null

問題描述

今天在寫一個工具類,裏面用了@Autowired注入了StringRedisTemplate以及RedisTemplate時,在template.opsForValue().set(key, obj)方法一直報 java.lang.nullpointerexception 異常,通過調試發現template爲null。java

Spring 注入失敗redis

可能的緣由: 網上百度了好久,緣由可能在於個人utils包的類和controller的類不是同一個上下文。服務器

解決辦法

經過添加如下三個關鍵的地方,能夠解決該問題函數

關於@PostConstruct:被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,而且只會被服務器調用一次,相似於Serclet的inti()方法。被@PostConstruct修飾的方法會在構造函數以後,init()方法以前運行。
//解決工具類中注入 3個步驟
@Component                     //關鍵步驟1,添加Component
public class RedisUtils {
    
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private RedisTemplate<String, Object> template;
    
    public static RedisUtils redisUtils;          // 關鍵2 添加該類的靜態對象
    protected static Logger logger = LoggerFactory.getLogger(RedisUtils.class);
    
    public RedisUtils() {
    }
    
    // 關鍵3 用PostConstruct修飾init方法,並在init方法中對其賦值
    @PostConstruct
    public void init() {
        redisUtils = this;
        redisUtils.template = this.template;
        redisUtils.stringRedisTemplate = this.stringRedisTemplate;
    }
    

這樣就能夠經過redisUtils.template.opsForValue().set(key, obj)調用了工具

相關文章
相關標籤/搜索