SchedulerFactoryBean 注入

今天在做Spring Quarter动态设置触发时间时,需要在Service中注入org.springframework.scheduling.quartz.SchedulerFactoryBean使用下面的代码可用:

localQuartzScheduler通过注解注入

@Resource

 private SchedulerFactoryBean localQuartzScheduler

Java代码   收藏代码
  1. Scheduler scheduler = localQuartzScheduler.getScheduler();localQuartzScheduler需要注入  
  2. String[] strArr = systemConfig.getConfigValue().split("-");  
  3. String day = strArr[2], month = strArr[1];  
  4. String cronExpression = "0 0 2 " + day + " " + month + " ?";  
  5.   
  6. try {  
  7.     CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("cronTrigger",  
  8.             Scheduler.DEFAULT_GROUP);  
  9.   
  10.     trigger.setCronExpression(cronExpression);  
  11.     scheduler.rescheduleJob("jsjYearCronTrigger", Scheduler.DEFAULT_GROUP, trigger);  
  12. catch (Exception e) {  
  13.     logger.error("重新设置年度任务执行日期失败", e);  
  14. }  

  启动tomcat报以下错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'addJob' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type [org.quartz.impl.StdScheduler] to required type [org.springframework.scheduling.quartz.SchedulerFactoryBean] for property 'scheduler'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [org.quartz.impl.StdScheduler] to required type [org.springframework.scheduling.quartz.SchedulerFactoryBean] for property 'scheduler': no matching editors or conversion strategy found

大致错误意思为类型不匹配。

上网查了一下

<bean id="Scheduler" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
</bean>
它是一个工厂bean,得到的不是它本身,而是它负责创建的org.quartz.impl.StdScheduler对象 只要把Service中的

private SchedulerFactoryBean localQuartzScheduler

改成

private Scheduler scheduler;

这样就可以。

为什么在xml定义的是 SchedulerFactoryBean 而注入的确是 org.quartz.impl.StdScheduler? 

上网查查 原来是FactoryBean导致的?

 

 FactoryBean接口是插入到Spring IoC容器用来定制实例化逻辑的一个接口点。如果你有一些复杂的初始化代码用Java可以更好来表示,而不是用(可能)冗长的XML,那么你就可以创建你自己的FactoryBean,并在那个类中写入复杂的初始化动作,然后把你定制的FactoryBean插入容器中。

FactoryBean接口提供三个方法:

Object getObject():返回一个由这个工厂创建的对象实例。这个实例可能被共享(取决于isSingleton()的返回值是singleton或prototype)。

boolean isSingleton():如果要让这个FactoryBean创建的对象实例为singleton则返回true,否则返回false。

Class getObjectType():返回通过getObject()方法返回的对象类型,如果该类型无法预料则返回null。

 

 查看ApplicationContext 的getBean方法,如果获取的bean实现了FactoryBean接口在getBean时代码如下:

Java代码   收藏代码
  1. private Object doGetObjectFromFactoryBean(FactoryBean factory, String beanName, boolean shouldPostProcess)  
  2.     throws BeanCreationException  
  3.  {  
  4.   Object object;  
  5.     try  
  6.     {  
  7.       //这里通过getObject返回对象,这里的object为Scheduler的实例  
  8.       object = factory.getObject();  
  9.     }  
 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值