之前也遇到過@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 {
}