我们要达到这样的效果

public class CancelUnpaidOrderTask implements Job {@Autowiredprivate AppOrderService orderService; @Override public void execute(JobExecutionContext ctx) throws JobExecutionException { ... }

但是Job对象的实例化过程是在Quartz中进行的,AppOrderService是在Spring容器当中的,那么如何将他们关联到一起呢。好在Quartz提供了JobFactory接口,让我们可以自定义实现创建Job的逻辑。

public interface JobFactory {Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException;
}

那么我们通过实现JobFactory 接口,在实例化Job以后,在通过ApplicationContext 将Job所需要的属性注入即可

在Spring与Quartz集成时 用到的是org.springframework.scheduling.quartz.SchedulerFactoryBean这个类。源码如下,我们只看最关键的地方。

        // Get Scheduler instance from SchedulerFactory.try {this.scheduler = createScheduler(schedulerFactory, this.schedulerName); populateSchedulerContext(); if (!this.jobFactorySet && !(this.scheduler instanceof RemoteScheduler)) { // Use AdaptableJobFactory as default for a local Scheduler, unless when // explicitly given a null value through the "jobFactory" bean property. this.jobFactory = new AdaptableJobFactory(); } if (this.jobFactory != null) { if (this.jobFactory instanceof SchedulerContextAware) { ((SchedulerContextAware) this.jobFactory).setSchedulerContext(this.scheduler.getContext()); } this.scheduler.setJobFactory(this.jobFactory); } }

其中红色标记的是重点,如果我们不指定jobFactory,那么Spring就使用AdaptableJobFactory。我们在来看一下这个类的实现

package org.springframework.scheduling.quartz;import java.lang.reflect.Method;import org.quartz.Job; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.spi.JobFactory; import org.quartz.spi.TriggerFiredBundle; import org.springframework.util.ReflectionUtils; public class AdaptableJobFactory implements JobFactory { public Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException { return newJob(bundle); } public Job newJob(TriggerFiredBundle bundle) throws SchedulerException { try { Object jobObject = createJobInstance(bundle); return adaptJob(jobObject); } catch (Exception ex) { throw new SchedulerException("Job instantiation failed", ex); } } protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { // Reflectively adapting to differences between Quartz 1.x and Quartz 2.0... Method getJobDetail = bundle.getClass().getMethod("getJobDetail"); Object jobDetail = ReflectionUtils.invokeMethod(getJobDetail, bundle); Method getJobClass = jobDetail.getClass().getMethod("getJobClass"); Class jobClass = (Class) ReflectionUtils.invokeMethod(getJobClass, jobDetail); return jobClass.newInstance(); } protected Job adaptJob(Object jobObject) throws Exception { if (jobObject instanceof Job) { return (Job) jobObject; } else if (jobObject instanceof Runnable) { return new DelegatingJob((Runnable) jobObject); } else { throw new IllegalArgumentException("Unable to execute job class [" + jobObject.getClass().getName() + "]: only [org.quartz.Job] and [java.lang.Runnable] supported."); } } }

其他的我们都不管,我们就看红色的地方,这里是创建了一个Job,那我们就在这里去给Job的属性进行注入就可以了,让我们写一个类继承它,然后复写这个方法进行对Job的注入。

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

接下来把他配置到Spring当中去

<bean id="jobFactory" class="com.gary.operation.jobdemo.demo1.MyJobFactory"></bean>

然后在把org.springframework.scheduling.quartz.SchedulerFactoryBean的jobFactory设置成我们自己的。

<bean name="MyScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  <!-- 其他属性省略 -->   <property name="jobFactory" ref="jobFactory"></property> </bean>

这样就完成了Spring对Job的注入功能,其实很简单,原理就是在我们扩展JobFactory创建job的方法,在创建完Job以后进行属性注入。

转载于:https://www.cnblogs.com/zhaofeng555/p/5783281.html

Spring3 M2 quartz-2.1.7 解决bean不能注入问题相关推荐

  1. 触发日期spring3整合quartz实现任务调度功能

    发一下牢骚和主题无关: 前段时光做项目,好几个项目都有务任调度的功能.自己也没做过这方面的开辟,特地抽了点时光研讨了一下这个玩意,觉感还是挺好用的,借此时光就给击打分享一下那个.我这里用的spring ...

  2. Spring是如何利用“三级缓存“巧妙解决Bean的循环依赖问题

    前言 循环依赖:就是N个类循环(嵌套)引用. 通俗的讲就是N个Bean互相引用对方,最终形成闭环.用一副经典的图示可以表示成这样(A.B.C都代表对象,虚线代表引用关系): 注意:其实可以N=1,也就 ...

  3. Spring解决bean之间的循环依赖(循环引用)

    2.概述 bean的实例化仅仅是获得了bean的实例,该bean仍在继续创建之中,之后在该bean实例的基础之上,还要做很多额外的操作,例如bean的属性填充.处理器的应用.bean的循环依赖解决等, ...

  4. 零配置 之 Spring 注解实现Bean依赖注入

    转载自  [第十二章]零配置 之 12.2 注解实现Bean依赖注入 --跟我学spring3 12.2  注解实现Bean依赖注入 12.2.1  概述 注解实现Bean配置主要用来进行如依赖注入. ...

  5. 解决定时任务无法注入的问题,配置类

    在定时任务执行的时候,当时间点到了,执行job的时候,有时候需要用到某些bean,但是自动注入是不行的,所以只能想其他办法, 新建class加入该配置类方可解决 package com.jszb.rz ...

  6. Spring常见错误 - Bean构造注入报空指针异常

    Spring常见错误 - Bean构造注入报空指针异常 前言 一. 构造器内报NPE 1.1 案例 1.2 原理分析 1.2.1 空指针发生在哪一个阶段? 1.2.2 studentService字段 ...

  7. 在kotlin companion object中读取Bean,注入Bean对象

    在kotlin companion object中读取Bean,注入Bean对象 在使用kotlin时,或多或少地会使用到一些公共组件,如 http. mongo. redis相关的组件.   使用组 ...

  8. 解决静态方法调用注入的service

    解决静态方法调用注入的service 参考文章: (1)解决静态方法调用注入的service (2)https://www.cnblogs.com/xiaoshahai/p/11610898.html ...

  9. 单元测试 applicationinfomanager bean无法注入_你真的会用Spring吗?如何在单例Bean中注入原型Bean...

    遇到什么问题 假设单例 BeanA 需要使用原型 BeanB(BeanB 可能是 BeanA 的一个属性值).可是容器仅创建一次单例 BeanA,因此只有一次机会来设置属性 BeanB. @Scope ...

最新文章

  1. laravel 中间件不生效_laravel中间件实战(luke)
  2. nchar,char,varchar与nvarchar区别(收藏)
  3. SpringBoot 学习 | raibaby Halo v0.4.3 漏洞分析-Ali0th
  4. python综合学习七之TensorFlow初识
  5. yaml 数组_接口测试:A01_HttpRunner基础_05_YAML格式测试用例
  6. 大学python怎么过_大学生该不该学Python?太纠结了?
  7. 黑苹果系统坏了如何恢复_黑苹果macOS系统U盘版/恢复版基础安装教程
  8. shell命令-if语句
  9. 找不到ad用户和计算机,清理可能废弃的AD用户和计算机账户
  10. 两岸大学生体验福州油纸伞制作技艺
  11. ArrayList错误:java.util.ConcurrentModificationException:null
  12. 图计算: 使用 Spark Graphx Pregel API 处理分层数据
  13. mysql连接数怎么清理_MySQL连接数太多应该怎么解决?
  14. 使用BERT做中文文本相似度计算与文本分类
  15. HashMap1.7 扩容时产生死链
  16. 晶体三极管原理及应用
  17. 《活出最乐观的自己》
  18. 400分理科学计算机,400分左右的理科大学 高考400分能上什么学校
  19. 一知半解学CubeMX——UART:Printf实现
  20. 2015淘宝最新排名新规则

热门文章

  1. HTML5基础-Mark标签高亮显示文本
  2. Android ViewGroup事件分发机制
  3. 使用 NOR Flash 中的supervivi 下载裸机程序到NandFlash
  4. android TextView 带滚动条,和ScrollView 用法(暂时觉得ScrollView滑动速度比较快)
  5. Android 监听ScrollView的滑动
  6. QT 信号与槽 最简单例子
  7. 凸包Graham Scan算法实现
  8. 贪心算法--删数问题
  9. ARM汇编:汇编语言跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
  10. 在定义常量时,为什么推荐使用const,而不是#define?