Spring 中FactoryBean getObject获得空值

这里的JobDetail返回为null

 @Bean
    public JobDetail printTimeJobDetail(){
        JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
        // durability 表示任务完成之后是否依然保留到数据库,默认falses
        jobDetailFactoryBean.setDurability(true);
        //当Quartz服务被中止后,再次启动或集群中其他机器接手任务时会尝试恢复执行之前未完成的所有任务
        jobDetailFactoryBean.setRequestsRecovery(true);
        jobDetailFactoryBean.setJobClass(MyDetailQuartzJobBean.class);
        jobDetailFactoryBean.setDescription("打印时间定时器2");
        Map<String,String> jobDataAsMap = new HashMap<>();
        jobDataAsMap.put("targetObject","printTimeQuartz"); //spring 中bean的名字
        jobDataAsMap.put("targetMethod","execute");   //执行方法名
        jobDetailFactoryBean.setJobDataAsMap(jobDataAsMap);
        return  jobDetailFactoryBean.getObject();
    }

 

我们从JobDetailFactoryBean源码入手,实现了InitializingBean接口,会实现afterPropertiesSet()接口,会在初始化bean的时候执行。

观察源码JobDetail在afterPropertiesSet()方法中产生。之所以上面JobDetail返回空,因为afterPropertiesSet()的执行在上面@Bean 注解的方法后执行。

 public void afterPropertiesSet() {
        Assert.notNull(this.jobClass, "Property 'jobClass' is required");
        if (this.name == null) {
            this.name = this.beanName;
        }

        if (this.group == null) {
            this.group = "DEFAULT";
        }

        if (this.applicationContextJobDataKey != null) {
            if (this.applicationContext == null) {
                throw new IllegalStateException("JobDetailBean needs to be set up in an ApplicationContext to be able to handle an 'applicationContextJobDataKey'");
            }

            this.getJobDataMap().put(this.applicationContextJobDataKey, this.applicationContext);
        }

        JobDetailImpl jdi = new JobDetailImpl();
        jdi.setName(this.name != null ? this.name : this.toString());
        jdi.setGroup(this.group);
        jdi.setJobClass(this.jobClass);
        jdi.setJobDataMap(this.jobDataMap);
        jdi.setDurability(this.durability);
        jdi.setRequestsRecovery(this.requestsRecovery);
        jdi.setDescription(this.description);
        this.jobDetail = jdi;
    }

 

我们可以这样写,并且能够在spring容器中找到JobDetail。这是FactortBean接口帮我们做到的

@Bean
    public JobDetailFactoryBean printTimeJobDetail(){
        JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
        // durability 表示任务完成之后是否依然保留到数据库,默认falses
        jobDetailFactoryBean.setDurability(true);
        //当Quartz服务被中止后,再次启动或集群中其他机器接手任务时会尝试恢复执行之前未完成的所有任务
        jobDetailFactoryBean.setRequestsRecovery(true);
        jobDetailFactoryBean.setJobClass(MyDetailQuartzJobBean.class);
        jobDetailFactoryBean.setDescription("打印时间定时器2");
        Map<String,String> jobDataAsMap = new HashMap<>();
        jobDataAsMap.put("targetObject","printTimeQuartz"); //spring 中bean的名字
        jobDataAsMap.put("targetMethod","execute");   //执行方法名
        jobDetailFactoryBean.setJobDataAsMap(jobDataAsMap);
        return  jobDetailFactoryBean;
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值