美文网首页Java
Timer定时器在项目初始化的时候注入service为null

Timer定时器在项目初始化的时候注入service为null

作者: 一觉睡到丶小时候 | 来源:发表于2020-01-03 17:05 被阅读0次

问题

在自定义的timer中需要注入业务类接口(service)完成相应的操作,但是在通过@Autowired注入后为null,导致在执行业务操作的时候报空指针错误。

源代码

需要做一个定时更新数据库的程序,因为比较简单,所以选择了Timer。
定义更新数据定时器UpdateDbTimerWorker

public class UpdateDbTimerWorker extends TimerTask {
   @Autowired
    private UpdateDbService updateDbService;
    
   @Override
    public void run() {
        if (TaskQueue.isBlock()) {
            UpdateDbTask task = null;
            try {
                task = TaskQueue.take();
                if (task != null) {
                    String type = task.getType();
                    if ("insert".equals(type)) {
                        updateDbService.insert(task);
                    } else {
                        updateDbService.update(task);
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        }
    }
}

UpdateDbService

public interface UpdateDbService {

    /**
     * 插入
     * @param task
     */
    void insert(UpdateDbTask task) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException;

    /**
     * 更新
     * @param task
     */
    void update(UpdateDbTask task) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException;
}

为了获取到这个注入对象,只能我们手动注入了,就是通过获取上下文对象,然后再对这个对象进行解析,然后取出自己所要的那个对像。

SpringContextUtil工具类

@Component
public class SpringContextUtil implements ApplicationContextAware {

    /**
     * Spring应用上下文环境
     */
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    /**
     * @return ApplicationContext
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 获取对象
     *
     * @param beanName
     * @return Object 一个以所给名字注册的bean的实例
     */
    public static Object getBean(String beanName){
        return applicationContext.getBean(beanName);
    }

    /**
     * 获取类型为requiredType的对象
     *
     * @param clz
     * @return
     * @throws BeansException
     */
    public static <T> T getBean(Class<T> clz) throws BeansException {
        @SuppressWarnings("unchecked")
        T result = (T) applicationContext.getBean(clz);
        return result;
    }


    /**
     * @param name
     * @return Class 注册对象的类型
     * @throws NoSuchBeanDefinitionException
     */
    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
        return applicationContext.getType(name);
    }

    /**
     * 如果给定的bean名字在bean定义中有别名,则返回这些别名
     *
     * @param name
     * @return
     * @throws NoSuchBeanDefinitionException
     */
    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
        return applicationContext.getAliases(name);
    }
}

解决

在定时器中通过SpringContextUtil获取bean

public class UpdateDbTimerWorker extends TimerTask {

     private UpdateDbService updateDbService = SpringContextUtil.getBean(UpdateDbServiceImpl.class);
     后略...

}

相关文章

  • Timer定时器在项目初始化的时候注入service为null

    问题 在自定义的timer中需要注入业务类接口(service)完成相应的操作,但是在通过@Autowired注入...

  • vue-setInterval定时器

    data () { return { theme:theme, timer:null, 定时器名称 // ...

  • spingboot遇到注入为null的坑

    注入为null主要有几个原因: 注入的实现类主键上没有加@@Component或@Service等注解。 使用注入...

  • RxSwift中的Timer

    RxSwift中的Timer 我们在项目中经常会用到定时器,先来看下swift中使用定时器的几种方式: Timer...

  • 定时器

    定时器 :Timer和TimerTask 定时器例子定时器原理做项目很多时候会用到定时任务,比如在深夜,流量较小的...

  • Swift中Timer

    1.初始化定时器 2.暂停,开启定时器 3.停止定时器 4.在滑动页面上的列表时,timer会暂停的原因,以及解决...

  • springboot websocket service注入失败

    在websocket里面,注入service进行数据库操作时,service为空注入失败

  • 定时器 Timer

    定时器 Timer [toc] 定时器 Timer 的使用 Timer 类主要负责计划任务的功能,也就是在指定时间...

  • iOS timer定时器正确使用方式

    1. 初始化,添加定时器前先移除 2. 释放timer 3. NSTimer不释放原因 原因是 Timer 添加到...

  • 【golang】定时器的使用

    一.一次性定时器Timer,定时器停止timer.Stop(),定时器重置timer.Reset() 二.周期定时...

网友评论

    本文标题:Timer定时器在项目初始化的时候注入service为null

    本文链接:https://www.haomeiwen.com/subject/sxxzoctx.html