SchedulerFactoryBean 注入

SchedulerFactoryBean 注入今天在做SpringQuarter动态设置触发时间时,需要在Service中注入org.springframework.scheduling.quartz.SchedulerFactoryBean使用下面的代码可用:localQuartzScheduler通过注解注入@Resource privateSchedulerFactoryBeanlocalQuartzScheduler

大家好,又见面了,我是你们的朋友全栈君。

今天在做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.     }  

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142161.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android从无知到有知——NO.7

    Android从无知到有知——NO.7

    2022年1月15日
    49
  • java面向对象的三大特性

    java面向对象的三大特性java面向对象的三大特性包括:封装、继承、多态一、封装1.含义:封装就是把同一类事物的共性(包括属性和方法)归到同一类中,方便使用。封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系。也就是说用户无需知道内部的数据和方法的具体实现细节,只需根据留在外部的接口进行操作就行。2.封装的实现需要修改属性的访问控制符(修改为private);创建getter/setter方

    2022年7月9日
    18
  • java开发面试题(40个常问面试题含答案,亲测有效)「建议收藏」

    java开发面试题(40个常问面试题含答案,亲测有效)「建议收藏」连接数据库的配置和操作加载JDBC驱动程序提供JDBC连接的URL创建数据库的连接需要向java.sql.DriverManager请求并获得Connection对象创建一个Statement对象执行SQL语句关闭JDBC对象创建对象的四种方式?1.使用new关键字创建对象2.通过反射的方式3.通过clone的方式j4.通过反序列化的方式接口与抽象类的区别?一个类只能继承一个抽象类,但可以实现多个接口抽象类可以有构造器,但接口不能有构造器抽象类中可以包含非抽象的普通方法,接口

    2022年7月7日
    23
  • vagrant up报错:unable to mount VirtualBox shared folders

    vagrant up报错:unable to mount VirtualBox shared folders

    2022年2月12日
    54
  • C语言实现选择排序

    C语言实现选择排序选择排序是在每一轮比较中不是每当a[i]<a[j]时候就交换,而是用一个变量k记下其中较小的元素的下标值,在a[i]与a[i+1]~a[n]全部进行比较后,只将a[i]与a[i+1]~a[n]中最小的值进行交换,为此每一轮只需要将a[i]与a[k]的值进行交换即可。设有n个数据存储到从a[0]~a[n+1]的n个数组元素中,则选择排序过程分为如下n-1步骤:第一步:在第1~n个数中找出最小者,然后与第一个数进行比较,前1个数排好序第二步:在第2~n个数中找出最小者,然后与第二个数进行交换,

    2022年6月25日
    27
  • 找出诡异的Bug:数据怎么存不进去[通俗易懂]

    找出诡异的Bug:数据怎么存不进去

    2022年1月29日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号