zoukankan      html  css  js  c++  java
  • TimerTask的run()方法里面如何调用service层里面的方法

    在java的spring框架中,用Timer和TimerTask来实现定时任务,有时我们要在TimerTask的子类的重写run方法里,调用service层的方法。

    但是不管是spring.xml配置的bean还是注解@autoware注入的bean,在执行的时候都会报空指针异常。

    刚开始的代码:

     代码一:TimerTask的子类

    public class AbcTask extends TimerTask {
        private AaaService aaaService;
    
        public void setAaaService(AaaService aaaService) {
            this.aaaService = aaaService;
        }
    
        @override
        public void run() {
            aaaService.delectSomething();
        }
    }

    代码二:Timer.schedule()的调用类

    public class Scheduler {
    
        public void timer0() {
        Timer timer
    = new Timer();
        t.schedule(
    new AbcTask(), 0, 1000 * 60 * 60 *24); } }

    代码三:spring.xml

    <bean id="abcTask" class="...AbcTask" />
    <bean id="scheduler" clas="...Scheduler" init-method="timer0" />

    问题:TimerTask不是由spring管理的,所以 TimerTask 内部的 service 也无法自动注入。
    解决:在spring的xml里,配置TimerTask bean对象,把它交由spring管理; 再把这个bean作为scheduler 的传入参数。
    修改过后的代码如下:

    代码二:Timer.schedule()的调用类

    public class Scheduler {
        private AbcTask abcTask;
    
        public void setAbcTask(AbcTask abcTask) {
            this.abcTask = abcTask;
    
        public void timer0() {
        Timer t = new Timer();
           t.schedule(abcTask, 0, 1000 * 60 * 60 *24);
      }
    }

    代码三:spring.xml

    <bean id="abcTask" class="...AbcTask" />
    <bean id="scheduler" clas="...Scheduler" init-method="timer0">
        <property name="abcTask" ref="abcTask"/>
    </bean>

    记一点:遵循 spring 管理的前提下,一定是不能 new 对象的。

  • 相关阅读:
    XMLHttpRequest 跨域问题
    jQuery+AJAX实现纯js分页功能
    PHP验证码
    PHP基础
    UIView易忽略点
    UITableView  优化
    SpringBoard界面层级结构分析
    给App在“设置”中添加选项(类似招行App)
    通过USB线SSH登陆到越狱手机上(命令行模式的),不通过wifi
    在IOS项目中使用Lua
  • 原文地址:https://www.cnblogs.com/boomoom/p/9136557.html
Copyright © 2011-2022 走看看