Quarta自定义的Job使用@Autowire提示空指针问题

一. 问题描述

  1. 在我们的自定义的Job类中,想用@Autowire注入属性,但该属性为空

    public class MyJob implements Job {
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            // Job中需要执行的方法
            System.out.println("这里是我们自定义的定时任务中,需要执行的任务"+rabbitTemplate);
        }
    }
    

    执行自定义的任务时,运行到这里就会包空指针异常的错误。

二. 问题讲解

  1. 这是因为**@Autowire时把属性注入到了Spring注入的job类实例中了**。
  2. 而我们的job类中方法执行时候,quartz会重新实例化一个jobClass,这个实例和Spring注入的实例是不同的,所以没有属性,属性就是空的。
  3. 因此执行到这里的时候就会报错

三. 解决方法

  1. 我们可以利用ApplicationContextAware接口获取到容器,然后再从容器中取出我们需要的bean对象。

  2. 做法是新建一个实现了ApplicationContextAware的类,该类用来从容器中取bean。

    @Component
    public class ApplicationContextUtils implements ApplicationContextAware {
        private static ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    
        // 根据name获取相应的bean
        public static Object getBean(String name){
            return applicationContext.getBean(name);
        }
    }
    
    
  3. 然后再需要的地方,通过这种方式来取值,这样就不会出现空指针的错误了。

    public class MyJob implements Job {
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            // Job中需要执行的方法
            System.out.println("这里是我们自定义的定时任务中,需要执行的任务"+ ApplicationContextUtils.getBean("rabbitTemplate"));
        }
    }
    

参考链接

  1. 用quartz开发调度任无法注入bean,出现空指针问题
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值