直播網站原始碼,使用Scheduled做定時任務出現Autowired注入空指標

zhibo系統開發發表於2023-03-13

直播網站原始碼,使用Scheduled做定時任務出現Autowired注入空指標

原因

因為Scheduled的載入時機要早於Autowired,定時任務會開啟一個新的程式,而spring值會注入到初始的類中,但這個有值類並沒有被使用,而是呼叫了無值的類。


解決

所以需要用到ApplicationContextUtil工具類

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
 * @author 成大事
 * @since 2022/5/8 11:19
 */
@Component
public class ApplicationContextUtil implements ApplicationContextAware {
    /**
     * 上下文物件例項
     */
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextUtil.applicationContext = applicationContext;
    }
    /**
     * 獲取applicationContext
     *
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
    /**
     * 透過name獲取 Bean.
     *
     * @param name
     * @return
     */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }
    /**
     * 透過class獲取Bean.
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }
    /**
     * 透過name,以及Clazz返回指定的Bean
     *
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}


正確示範

 

 //注入方式不用@Autowired,改成下面的程式碼注入
    private final BrowseRecordsService browseRecordsService= ApplicationContextUtil.getBean(BrowseRecordsService.class);
    
    @ApiOperation("清除過期的瀏覽記錄")
    public void removeExpireBrowseRecords() {
        log.info("清楚過期的瀏覽記錄:");
        browseRecordsService.getBaseMapper().delete(new QueryWrapper<BrowseRecords>()
                .lt("create_time", DateUtil.lastMonth()));
    }


注意事項:

ApplicationContextUtil 的程式碼位置要在task程式碼之前,啟動服務時,程式碼的順序,會影響到執行順序,如果位置不正確,還是會導致service獲取空指標

 以上就是直播網站原始碼,使用Scheduled做定時任務出現Autowired注入空指標, 更多內容歡迎關注之後的文章


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978258/viewspace-2939317/,如需轉載,請註明出處,否則將追究法律責任。

相關文章