解决Spring中Quart无法自动注入Bean问题
来源:互联网 发布:城通网盘软件下载 编辑:程序博客网 时间:2024/05/22 01:43
因项目需求,之前项目中已经有定时器的例子了,但是需求那边过来的需求之前用的定时器并不能满足,之前的定时器是用spring里面的@Scheduled(cron = "0 0 0 * * ? ")这种方式,这是一种死的定时器,需求要的是动态定时器,用户添加一个定时器,则系统就要自动添加一个定时器,等待执行。 才出现以下在执行的时候,出现对象空值的情况。
一般情况下,quartz的job中使用autowired注解注入的对象为空,这时候我们就要使用spring-quartz提供的AdaptableJobFactory类。
废话不多说,直接上代码:
A.第一步:
这是一个(quartz的job中注入spring对象) 的类,查阅各种资料,这个类是必须的。
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
/**
*
* @author hhd
* quartz的job中注入spring对象
*
*/
public class SpringBeanJobFactory extends AdaptableJobFactory{
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
//调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
//进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
这个类,说明一下。根据个人情况,网上查阅资料显示:有人重新定义了一个Job的接口,然后定义一个AdaptableJobFactory类,让这个类实现刚刚定义的Job接口,他这里的意思就是说,定义一个新的接口,让这个接口覆盖原来的Job接口。接着就是quartz的job中注入spring对象 这个类,继承 刚刚定义一个AdaptableJobFactory类。
这种情况,根据个人的需求试过了,根本不起作用,也是无法自动注入Bean。
B.第二步
配置spring.xml ,在spring.xml中添加以下bean 即可,注意:第一个bean里面的bean为自己定义的类的路径
<!-- 配置spring-quartz,解决quartz的job无法注入spring对象的问题 -->
<bean id="jobFactory" class="com.cmsz.monitor.schedule.SpringBeanJobFactory"/>
<!-- 调度器 -->
<bean name="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="jobFactory"/>
</bean>
C.第三步:
定时器的执行器类。 这个类直接实现Job接口
import org.quartz.Job;
public class QuartzJobExample implements Job {
@Autowired
private RuleDao ruleDao;
/**
*执行方法
*/
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
//这里可以尝试打印注入的bean对象是否成功,如果不成功,会打印 出null 成功则打印一个对象出来。
System.out.println(ruleDao);
}
}
如果执行器类,打印的是一个对象,那么你的问题也是解决了,但是对我的这个需求来说还是打印的null。
通过网上资料,看到一个,个人抱着并不成功的想法试着把代码写上去,结果还真的打印出一个对象了。
代码如下:
//自动注入成员变量实现类
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
上面这行代码需要放在执行器类的执行方法里面。
因为项目出现问题,查找资料,并没有一个完整的解决办法,所以记录这个人尝试成功的过程。希望可以给大家带来帮助。。。。
- 解决Spring中Quart无法自动注入Bean问题
- 解决Spring+Quartz无法自动注入bean问题
- 解决Spring+Quartz无法自动注入bean问题
- 解决Spring+Quartz无法自动注入bean问题
- 解决spring-boot 中 bean无法注入的问题
- Spring+Quartz无法自动注入bean问题
- Spring+Quartz 定时任务无法自动注入bean的问题
- spring无法注入Bean的问题及解决
- 解决spring boot websocket无法注入bean的问题
- 解决spring boot websocket无法注入bean的问题
- 解决Spring中singleton中注入prototype Bean的问题
- 解决Spring在某些条件下无法自动注入的问题
- Spring自动注入Bean
- Spring自动注入Bean
- 关于spring boot无法自动注入bean问题解决方案
- 解决spring 自动扫描包的时候出现 service无法自动注入的问题
- Spring整合Quartz时,任务类中无法注入Bean的问题
- Spring4.X+Quartz2.X无法自动注入bean问题
- vue-cli搭建后如何加入新页面
- TensorFlow on Android:训练模型
- C++总结笔记
- 小蓝单车CEO父亲“顶雷”:谁要钱给谁打工
- 外媒称这是今年最好的15款智能手机!iPhone X都只排第4
- 解决Spring中Quart无法自动注入Bean问题
- 图解机器学习
- 使用Fiddler抓Android应用的包
- laravel中防止表单重复提交的综合解决方案
- 读取properties文件中的内容
- Spring boot Mybatis 整合(注解版)
- 大数据常用到的25个名词
- maven的安装配置及与myeclipse的集成 笔记
- Ubuntu下安装PDF阅读器Foxit Reader