Quartz定時調度框架中@Autowired爲null的解決辦法,同時避免打包運行空指針問題

之前也遇到過@Autowired爲null的問題,

但是不涉及定時調度,https://blog.csdn.net/hmmmmm2929/article/details/100739060

 

簡單介紹一下我需要用到的幾個類

(1)配置類(需要加這個配置類,來幫助導入bean)

(2)任務抽象類(SendInterface,忽略這個命名,其實不是接口,而是抽象類)

(3)任務實現類(SendTaskImpl)

 

我需要在SendTaskImpl中注入dao層,但是發現使用@Autowired,注入的結果爲null

因此參考網上資料,加了一個配置類

/**
 * 系統bean幫助類
 */
@Component("springContextUtil")
public class SpringContextUtil implements ApplicationContextAware  {

    private static ApplicationContext context;

    @Override
    @SuppressWarnings("static-access" )
    public void setApplicationContext(ApplicationContext contex)
            throws BeansException {
        // TODO Auto-generated method stub
        SpringContextUtil.context = contex;
    }
    public static Object getBean(String beanName){
        return context.getBean(beanName);
    }

    public static String getMessage(String key){
        return context.getMessage(key, null, Locale.getDefault());
    }
}

然後在SendTaskImpl中通過這個配置類來獲取bean,即,將原本想通過@Autowired注入的類,改成用上面的配置類來獲取

例如,這個DeviceRepository就是我想要注入的類,我希望使用deviceRepository來調用其中的一些方法

DeviceRepository中如果沒有配置bean的名字,默認的就是類名的首字母小寫的駝峯形式

public class SendTaskImpl extends SendTaskInterface {

    private DeviceRepository deviceRepository=(DeviceRepository) SpringContextUtil.getBean("deviceRepository");
    .......
}

需要注意的是,如果僅有上面這些步驟,在打包運行的時候很有可能會報空指針

必須保證配置類在被調用之前,提前加載

由於我的任務實現類(SendTaskImpl)繼承了任務抽象類(SendInterface),因此我只要保證配置類在任務抽象類加載之前被加載即可

因此加上了@DependsOn註解

@DependsOn("springContextUtil")
public abstract class SendTaskInterface implements Job {

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章