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)

spring+quartz 实现定时任务三

微信公众号的SpringBoot+Quartz的定时任务Demo

在Listener(监听器)定时启动的TimerTask(定时任务)中使用Spring@Service注解的bean

在Listener(监听器)定时启动的TimerTask(定时任务)中使用Spring@Service注解的bean