在Quartz的定时方法里引用@Autowired注入Bean,会报空指针错误
解决办法:使用Spring原生获取Bean的方法 取代 @Autowired注入
示例类
注解方式写了一个定时方法,方法里需要引用Dao层,插入数据库,
直接@Autowired会报空指针异常,做出如下红色字体改动
public class FTPUtil{ // @Autowired // MicroCameraPassRecordDao microCameraPassRecordDao; private static MicroCameraPassRecordDao microCameraPassRecordDao = null; 使用Spring获取注入bean public FTPUtil() { microCameraPassRecordDao = (MicroCameraPassRecordDao) SpringContextUtils.getApplicationContext().getBean("microCameraPassRecordDao"); } /** * 定时从FTP下载图片到本地,在这个方法里调用别的Dao层的方法 */ @Scheduled(cron="0/20 * * * * * ?") @Lazy(false) public synchronized void service() { FTPUtil ftpUtil = new FTPUtil(); boolean isConnect = ftpUtil.connectServer(); //从FTP下载到工程file下 boolean flag = ftpUtil.download(getFtpPath()); //引用注入Bean,插入数据库 MicroCameraPassRecord cameraRecord = new MicroCameraPassRecord(); cameraRecord.setCameraId(deviceID); cameraRecord.setAddTime(System.currentTimeMillis()); microCameraPassRecordDao.insert(cameraRecord); } }
getBean(引用类名,开头字母小写)
SpringContextUtils
Spring获取Bean的工具类:
package com.zit.util; import java.util.Map; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Service; @SuppressWarnings({ "rawtypes", "unchecked" }) @Service("springContextUtils") public class SpringContextUtils implements ApplicationContextAware { private static ApplicationContext applicationContext; public void setApplicationContext(ApplicationContext arg0) throws BeansException { applicationContext = arg0; } /** * 获取applicationContext对象 * @return */ public static ApplicationContext getApplicationContext(){ return applicationContext; } /** * 根据bean的id来查找对象 * @param id * @return */ public static Object getBeanById(String id){ return applicationContext.getBean(id); } /** * 根据bean的class来查找对象 * @param c * @return */ public static Object getBeanByClass(Class c){ return applicationContext.getBean(c); } /** * 根据bean的class来查找所有的对象(包括子类) * @param c * @return */ public static Map getBeansByClass(Class c){ return applicationContext.getBeansOfType(c); } }