资讯专栏INFORMATION COLUMN

SpringBoot 多线程处理任务 无法@Autowired注入bean问题解决

ASCH / 3163人阅读

摘要:在多线程处理问题时,无法通过注入,报空指针异常,在线程中为了线程安全,是防注入的,如果要用到这个类,只能从工厂里拿个实例。解决方法如下创建一个工具类代码获取对象的工具类上下文对象实例获取通过获取通过获取通过以及返回指定的使用方法

在多线程处理问题时,无法通过@Autowired注入bean,报空指针异常,

在线程中为了线程安全,是防注入的,如果要用到这个类,只能从bean工厂里拿个实例。

解决方法如下:

1.创建一个工具类代码:

package com.hqgd.pms.common;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @Description: 获取bean对象的工具类
 * @Author: yaorong
 * @CreateDate: 2018/12/10
 */

@Component
public class SpringContextUtil implements ApplicationContextAware {
    /**
     * 上下文对象实例
     */
    private static ApplicationContext applicationContext;

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

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

    /**
     * 通过name获取 Bean.
     *
     * @param name
     * @return
     */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /**
     * 通过class获取Bean.
     *
     * @param clazz
     * @param 
     * @return
     */
    public static  T getBean(Class clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 通过name,以及Clazz返回指定的Bean
     *
     * @param name
     * @param clazz
     * @param 
     * @return
     */
    public static  T getBean(String name, Class clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}

2.使用方法

@Slf4j
@Service
public class SerialPortService {
    public static SerialPort mSerialport = null;
//    private SimpMessagingTemplate simpMessage;
    private DataAcquisitionService das;
    private SystemService systemService;
    private SysParamMapper sysParamMapper;

    public SerialPortService() {
        this.das = SpringContextUtil.getBean(DataAcquisitionService.class);
        this.systemService = SpringContextUtil.getBean(SystemService.class);
        this.sysParamMapper = SpringContextUtil.getBean(SysParamMapper.class);
    }

}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74806.html

相关文章

  • 消息推送异常重发需要注意的点(上篇)

    摘要:无证连接进行异常记录并关闭连接。离线消息检测到上线立即推送这是消息推送需要实现的基本功能之一了,详见代码。主要功能协助进行初始化,心跳包检测,断线自动重连消息推送的第二种方式在下篇中再编写 消息重发中需要注意的问题 由于最近工作中接触了比较多关闭消息推送以及异常重发机制的问题,终于得空总结一下经验 目前接触的消息推送分为两种 主动推送:一般为websocket建立长连接实现,此处网上...

    terro 评论0 收藏0
  • SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)

    摘要:也是自带的一个基于线程池设计的定时任务类。其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响。 原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10659045.html,否则将追究法律责任!!! 一、在JAVA开发领域,目前可以通过以下几种方式进行定时任务 1、单机部署模式 Timer:jdk中...

    BWrong 评论0 收藏0
  • Springboot整合Quartz实现动态定时任务

    摘要:本文使用实现对定时任务的增删改查启用停用等功能。并把定时任务持久化到数据库以及支持集群。决定什么时候来执行任务。定义的是任务数据,而真正的执行逻辑是在中。封装定时任务接口添加一个暂停恢复删除修改暂停所有恢复所有 简介 Quartz是一款功能强大的任务调度器,可以实现较为复杂的调度功能,如每月一号执行、每天凌晨执行、每周五执行等等,还支持分布式调度。本文使用Springboot+Myba...

    IamDLY 评论0 收藏0

发表评论

0条评论

ASCH

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<