一. 问题描述
-
在我们的自定义的
Job
类中,想用@Autowire
注入属性,但该属性为空public class MyJob implements Job { @Autowired private RabbitTemplate rabbitTemplate; @Override public void execute(JobExecutionContext context) throws JobExecutionException { // Job中需要执行的方法 System.out.println("这里是我们自定义的定时任务中,需要执行的任务"+rabbitTemplate); } }
执行自定义的任务时,运行到这里就会包空指针异常的错误。
二. 问题讲解
- 这是因为**@Autowire时把属性注入到了Spring注入的job类实例中了**。
- 而我们的job类中方法执行时候,quartz会重新实例化一个jobClass,这个实例和Spring注入的实例是不同的,所以没有属性,属性就是空的。
- 因此执行到这里的时候就会报错
三. 解决方法
-
我们可以利用
ApplicationContextAware
接口获取到容器,然后再从容器中取出我们需要的bean对象。 -
做法是新建一个实现了
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); } }
-
然后再需要的地方,通过这种方式来取值,这样就不会出现空指针的错误了。
public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // Job中需要执行的方法 System.out.println("这里是我们自定义的定时任务中,需要执行的任务"+ ApplicationContextUtils.getBean("rabbitTemplate")); } }