Quartz框架定时任务处理类如何调用mapper层
mapper用@Autowired注入为null
如下代码,myMapper没有注入成功为null,报空指针异常
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
@Component
public class MyJob implements QuartzJobBean {
@Autowired
private MyMapper myMapper;
@Override
public void executeInternal(JobExecutionContext context) throws JobExecutionException {
// 在这里编写定时任务的逻辑
// 可以调用 myMapper 进行数据库操作
// 例如:myMapper.insertData(...);
}
}
出现问题原因
在 Quartz 中,QuartzJobBean 是一个抽象类,用于表示 Quartz 的 Job 类。当调度器执行定时任务时,Quartz 将实例化 QuartzJobBean 的子类,并调用其 executeInternal() 方法来执行任务。由于 QuartzJobBean 是 Quartz 框架提供的类,而不是由 Spring 容器管理的 Bean,因此 Spring 无法对其进行依赖注入。
解决这个问题的一种常见方法是手动获取 Spring 容器中的 Bean,而不是依赖 Spring 的自动注入机制。你可以通过在 Quartz Job 类中使用静态变量保存 Spring 容器的引用,然后在执行任务时从静态变量中获取 Bean。
解决方法
代码如下:
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
@Component
public class MyJob extends QuartzJobBean implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
MyJob.applicationContext = applicationContext;
}
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
// 通过 applicationContext 获取 myMapper Bean
MyMapper myMapper = applicationContext.getBean(MyMapper.class);
// 执行数据库操作
// myMapper.someMethod();
}
}
在这个示例中,MyJob 类实现了 ApplicationContextAware 接口,这样它就能够获取 Spring 容器的引用并保存在静态变量 applicationContext 中。然后,在 executeInternal() 方法中,通过这个静态变量来获取 MyMapper 类的 Bean 实例。