spring 定时任务注入service问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring 定时任务注入service问题相关的知识,希望对你有一定的参考价值。
我的系统采用spring框架,我现在有个需求,定时任务,采用quattz,这个任务类需要调用server层的对象,所以我写了一个工具类继承ApplicationContextAware,这样可以获取到对象ApplicationContext,然后调用getbean获取所需要的service,图片中展示了继承ApplicationContextAware会自动注入application,我写了一个测试方法获取service对象,如图,输出之后报错。
你写了定时任务的配置文件了吗?spring-scheduler.xml?
这是我用过的写法
希望对你有帮助
参考技术A 在网上参考了大量方法,试过了,用到 AdaptableJobFactory这个类。自定义一个类:
Java code?public class JobFactory extends AdaptableJobFactory
@Autowired private AutowireCapableBeanFactory capableBeanFactory; @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception // 调用父类的方法 Object jobInstance = super.createJobInstance(bundle); System.out.println("capableBeanFactory----------" + capableBeanFactory); // 进行注入 capableBeanFactory.autowireBean(jobInstance); return jobInstance;
然后在spring中配置:
XML/html code? <!-- 定时任务的factorybean,配置其他config --> <bean id="jobFactory" class="com.scm.util.common.JobFactory"></bean> <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 --> <bean id="startQuertz" lazy-init="true" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="jobFactory" ref="jobFactory"/> <property name="triggers"> <list> <ref bean="cronTrigger" /> </list> </property> </bean>追问
我这个没有加入定时任务,就都有问题了,后面也就无法继续了
参考技术B 继承ApplicationContextAware的类和启动类放一块试试spring+quartz 实现定时任务三
其实,上面2篇都已经可以完成所有客户的需求,在这一篇,记录实现过程遇见一个很奇怪的问题.
那就是spring的自动加载
在真正的task里面,难免需要完成对数据库的操作,这样就需要自动注入service.
但是很奇怪,无论如何,无法注入,折腾了很久,service都是null.
于是采用迂回的方式完成bean的注入.
1. 在spring配置文件里面定义一个获取上下文的bean
<bean id ="getContext" class="com.aw.task.ApplicationContextHelper"></bean>
具体代码:
public class ApplicationContextHelper implements ApplicationContextAware { private static ApplicationContext context; @Override public void setApplicationContext(ApplicationContext contex) throws BeansException { ApplicationContextHelper.context = contex; } public static ApplicationContext getContext() { return context; } }
2. 在真正实现的task里面,首先定义
private SellerMapper sellerMapper; ApplicationContext context = ApplicationContextHelper.getContext(); sellerMapper = (SellerMapper)context.getBean("sellerMapper");
这样才能获取到mapper的bean.
在非task的类里面,service的bean也可以直接获取到,但是在上面的代码里面,只能获取到mapper类,实在找不到什么情况了.
如果有大神知道的还请指导下.
以上是关于spring 定时任务注入service问题的主要内容,如果未能解决你的问题,请参考以下文章
Springboot 定时任务,service层无法注入问题详细解决
java定时器无法自动注入的问题解析(原来Spring定时器可以这样注入service)
微信公众号的SpringBoot+Quartz的定时任务Demo