zoukankan      html  css  js  c++  java
  • SpringMVC中定时器继承Task后无法对service注入问题

    最近在做一个Spring+MyBatis的一个项目,其中用到了Redis的存储,然后遇到问题是这样的:

    RedisTask是通过定时器来每分钟像数据库里推送的,于是就有了

    public class RedisTask  extends Task {
    
        public void execute(TaskExecutionContext executor) throws RuntimeException {
        ……
        ……
        }
     }

         然后在定时器的任务中通过对Redis的调用,推送到本地数据库

    OrderService orderService = new OrderService();
    Order order = new Order();
    int num = orderService.add(order);
    System.out.println("插入条数为:" + num);

    那么问题来了,tomcat开始没次调用定时器的RedisTask就开始报错,debug发现orderService为null,也就是说service根本就没有注入。

    然后我就在Spring的配置文件里查看标注问题,发现根本没问题,再然后发现此方法继承了Task,于是乎恍然大悟

    :定时器继承了Task之后,在定时器调用此方法后会直接执行execute方法,来不急执行标注进行注入。

     @Resource
        private OrderService orderService;

     然后解决方案:

    1、引入ApplicationContextUtil的工具类

    package com.aneop.common.util;
     
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
     
    public class ApplicationContextUtil implements ApplicationContextAware {
        private static ApplicationContext applicationContext;
     
        public static ApplicationContext getApplicationContext() {
            return applicationContext;
        }
     
        public void setApplicationContext(ApplicationContext applicationContext) {
            ApplicationContextUtil.applicationContext = applicationContext;
        }
     
        public static Object getBean(String beanName) {
            return applicationContext.getBean(beanName);
        }
    }

     2、在execute方法中以这种方式进行对service进行注入

    OrderService orderService = (OrderService)ApplicationContextUtil.getBean("orderService");

    注:在service的接口的@Service标注中必须写明注入的名字。 

    @Service("orderService")
    public class OrderServiceImpl implements OrderService {
  • 相关阅读:
    Oracle RAC asm常用命令
    Oracle10g RAC关闭及启动步骤
    工具系列 | git checkout 可替换命令 git switch 和 git restore
    工具系列 | 博客签名
    工具系列 | Token认证方式之JWT【转载】
    PHP系列 | ThinkPHP5.1 如何自动加载第三方SDK(非composer包 )
    工具系列 | 虚拟化VMware ESXi 6.7服务器安装配置
    安全系列 | 【阿里云】安全告警处理-进程异常行为-访问恶意下载源
    其他系列 | Github 贡献统计异常的处理
    MySQL系列 | 安装 MySQL 5.7 on Ubuntu 16.04 | 18.04
  • 原文地址:https://www.cnblogs.com/yhtboke/p/6163274.html
Copyright © 2011-2022 走看看