java多线程中注入Spring对象使用@Autowird失败的问题

记一次接入websocket过程中@ServerEndpoint和@Scope(“prototype“)、@Autowire、@Postconstruct一起使用不生效的原因分析 阅读详情

 

web应用中java多线程并发处理业务时,容易抛出NullPointerException。

原因:

线程中的Spring Bean没有被注入。web容器在启动时,没有提前将线程中的bean注入,在线程启动之前,web容器是无法感知的。

解决方案:

方法一、在声明成员变量的时候,将其定义为static的。(据说不可行)

方法二、将线程设置为主程序的内部类。

    在外部类中注入bean,这样在内部类线程中就可以“共享”这个对象。

方法三、定义一个工具类,使用静态工厂方法通过getBean获得bean对象。

 

问题说明 : 

在spring框架进行项目开发,平时遇到了需要批量处理的数据的时候,会选择多线程进行数据批跑,但是会发现,启动多线程后,线程会出现service或者mapper文件注入失败的问题,导致线程启动失败,其中bean的注入方式选择的是spring常规的注解@Autowired进行注入

原因分析 :

web容器在启动应用时,spring容器是无法感知多线程的那些bean的,所以多线程的bean类无法获取spring容器的上下文,并不能通过@Autowired注入需要的bean

解决方案 :

直接在线程中获取bean

Service service = ApplicationContext.getBean(ServiceImpl.class);

 

【异常】解决@Autowired注入依赖失败的问题,required a bean of type that could not be found. Autowired(required=true) 结合报错信息及代码,报错处的代码为ActiveIncrUserTimer使用了注解@Autowired进行依赖注入,但是没有找到可以被用来注入的实例。即Spring Boot获取ActiveIncrUserService 的实例失败。原来是我不小心把这个代码ActiveIncrUserServiceImp给误删了。 阅读详情

相关推荐

UOS的ARM机编译QT5.14.2记录

我需要的qt版本是Qt5.14.2,所以选择编译Qt5.14.2源码;几个月前尝试了编译一次,当时编译过程中出现了报错,当时时间很紧最后安装的默认版本来使用,最近有时间重新进行了一次编译,历经3个星期(4G的内存)终于解决了各种坑,编译成功了,现在将编译过程中遇见的一些坑记录一下,方便日后能记得这一次可恶的编译过程,如有描述欠缺的地方,还希望各位大佬给点意见指导指导🙏。

NiF693zzz的博客 1619

Spring获取ApplicationContext ,以及Bean

Spring中获取Bean 的方式:(根据方法名称获取Bean) Spring在代码中获取bean的几种方式 最实用的方法是: import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework....

技术人员 883

Redis【实战篇】---- 分布式锁-redission

重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,他的方法都是使用synchronized修饰的,假如他在一个方法内,调用另一个方法,那么此时如果是不可重入的,不就死锁了吗?所以可重入锁他的主要意义是防止死锁,我们的synchronized和Lock锁都是可重入的。不可重试:是指目前的分布式只能尝试一次,我们认为合理的情况是:当线程在获得锁失败后,他应该能再次尝试获得锁。

是微风,是晚霞,是无可替代 1万+

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

在多线程处理问题时,无法通过@Autowired注入bean,报空指针异常,在线程中为了线程安全,是防注入的,如果要用到这个类,只能从bean工厂里拿个实例。解决方法如下:1.创建一个工具类代码:package com.hqgd.pms.common;import org.springframework.beans.BeansException;import org.springframework...

weixin_42497633的博客 490

【Python实战解析】从数据爬取到房价预测:一个完整的数据科学项目流程拆解

本文详细拆解了一个完整的Python数据科学项目流程,从爬取长沙二手房数据到房价预测模型构建。通过实战案例,介绍了数据爬取、清洗、可视化及模型优化的关键技巧,帮助开发者掌握Python在数据分析中的应用,提升程序开发能力。

weixin_30379531的博客 412

基于强化学习方法的PID参数整定

前言 PID控制器在工业界应用非常广泛,但是PID的参数调节一般需要人工根据经验法来试。对于有经验的工程师来说,一般试几次就可以获得满足调节的参数。然而对于新手工程师却很难确定一套比较好的参数。 这里我们采用强化学习的方法来调节PID参数。 这个例子展示了如何使用双延迟深度确定性策略梯度(TD3:twin-delayed deep deterministic policy gradient)强化学习算法来调整PI控制器。整定控制器的性能与使用Control System Tuner app整定的控制器的性能

weixin_42188287的博客 2万+

Java解决多线程无法@Autowired注入,手动获取Bean对象

问题 当我们使用多线程时,又想注入一个service给我们使用,但是我们发现service总是为null。 原因 new Thread不在spring容器中,也就无法获得spring中的bean对象。 解决方案 1.最简单的方法 把要注入的service通过构造方法传过去 2.通过ApplicationContext手动获取Bean(Springboot版本,其他自行百度) 定义congfig package cn.pconline.config; import org.sprin..

zhy1805的博客 1064

第四章 汇川技术InoProShop入门之串口自由协议解读

摘要: 串口自由协议是工业自动化中针对特定需求设计的自定义通信协议,具有高度灵活性和针对性,适用于小型设备、实时控制等场景。其核心包括自定义帧结构(起始符、地址码、数据区、校验位等)和通信规则(波特率、交互机制)。相比标准协议,自由协议效率更高但兼容性弱,设计时需注重可靠性、效率和可扩展性,适用于定制化或高实时性需求,如传感器数据采集或老旧设备改造。典型应用需平衡精简帧结构与抗干扰能力,同时预留扩展空间。

zyfucking2010的博客 2218

Java多线程无法@AutoWired失败

标题解决多线程无法通过@Autowired注入实例bean import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; //解决多线程 无法通

weixin_42040369的博客 726

CentOS7环境下搭建 rsyslog 日志服务器,rsyslog+loganalyzer

1.系统环境部署 ip hostname 192.168.200.182 web 192.168.200.184 rsyslog-mysql 关闭防火墙、selinux、下载epel源 [root@web ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/f

sehn_的博客 3756

可疑物品遗留检测系统:基于YOLOv8的智能安防解决方案

数据采集与标注模块:负责收集和标注可疑物品图像数据模型训练模块:基于YOLOv8算法训练检测模型推理检测模块:加载训练好的模型进行实时检测用户界面模块:提供友好的操作界面和可视化结果展示报警模块:当检测到可疑物品时触发报警机制:包含多种暴力场景和可疑物品SUAVe:监控场景下的异常行为与物品数据集:包含多种可疑物品自建数据集:针对特定场景收集的数据背包(backpack)手提箱(suitcase)无人看管的包裹(package)可疑箱子(box)

YOLO 435

解决线程类中不能使用@Autowired注解注入Bean

解决得问题:new出来的线程类中无法使用@Autowired注入Bean 根本原因: @Autowired注入Spring Bean,则当前类必须也是Spring Bean才能注入成功,不能用new xxx()来获得对象,这种方式获得的对象也无法使用@Autowired注解注入Bean。 因此,当我们在new一个线程之后,发现线程里使用@Autowired注入的对象都是空的 解决办法是:我们新增一个类,实现ApplicationContextAware接口 import java.lang.anno

xiegongmiao的博客 3356

LAMMPS-使用MATLAB计算径向分布函数

首先需要使用LAMMPS进行分子动力学模拟,并获取到所需的数据文件,LAMMPS是一款开源的分子动力学模拟软件,可以模拟原子、分子和离子的运动行为,对于本文的目标假设你已经完成了LAMMPS的安装和模拟过程,获得了数据文件。)是一种重要的统计工具,用于描述原子或分子之间的空间分布情况,通过计算RDF可以获得物质的结构信息、相互作用距离以及相位转变等重要参数,本文将介绍如何使用MATLAB计算LAMMPS生成的数据文件的径向分布函数。变量替换为你的实际数据文件的名称。

weixin_50547796的博客 518

Spring为啥不推荐使用@Autowired注解?

引言 使用IDEA开发时,同组小伙伴都喜欢用@Autowired注入,代码一片warning,看着很不舒服,@Autowired作为Spring的亲儿子,为啥在IDEA中提示了一个警告:Field injection is not recommended 想搞清楚这个问题之前,首先先了解一下依赖注入的几种方式 Spring的三种注入方式 属性(filed)注入 这种注入方式就是在bean的变量上使用注解进行依赖注入。本质上是通过反射的方式直接注入到field。这是我平常开发中看的最多也是最熟悉的一种方式。

开源世界 1730

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

多线程时Autowired自动注入问题

原因就是spring和多线程安全的问题,不让注入 第一种:手动获取,获取spring上下文,写一个工具通过BeanName获取 解决方法:手动获取 package com.test.configs;   import org.springframework.beans.BeansException; import org.springframework.context.Application...

qq_36083215的博客 7493

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java 线程类注入失败_多线程中使用Spring的注入问题

在开发中经常会使用 Spring 的@Autowired 来实现对象的自动注入,但是在最近的开发中在多线程中用 Spring 的@Autowired 来自动注入时总是注入不进去,代码如下:Java 代码packagecom.common.base.utils.SpringUtils;importorg.springframework.beans.factory.annotation.Autow...

weixin_36003005的博客 806

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

@Autowired 不能注入但是getBean()可以注入

1.getBean()能拿到,说明这个类已经成功注入到容器里了,不是该类的问题。 2.容器内的类可以相互 随便注入,但是当前类却不能获取IOC容器里的bean说明 当前类有可能没有在容器里,添加@Component试一试...

qq_33451502的博客 2946

SSM框架,使用getBean可以成功获取,但是使用AutoWired注解出现错误

错误如下:Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userService'; nested e...

小小学渣的博客 2475

springboot中@Autowired 注入失效的四种原因及解决方法

通常是因为被注入的对象没有被spring扫描到,此时需要添加对应的包扫描路径。 2. 需要自动注入的对象不是spring加载,而是new的方式创建 由于对象不是spring创建的,当然spring也就无法根据注解自动注入对应的实例对象。此时可以采用代码的方式,从spring容器中获取对象实例。 3. 需要自动注入的对象不是spring加载,而是采用反射的方式创建 这种情况和第二种情况类似,通常在一些框架调用的时候,采用的对象创建方式,为了避免对spring的依赖,采用类的反射方式进行创建。 4. 使用spr

m0_67390969的博客 1万+

多线程无法使用@Autowired注入问题

当我们使用线程池执行任务时,想给线程注入一个service,但是运行时发现service总是为null。根据Bean生命周期,能够被Spring管理的Bean都是在扫描范围内并且有 @Componen、@Service、@Configuration 等注释,在使用时才能用IOC注入对象。如果使用new 关键字手动生成的对象,Sring感知不到,无法管理。

xmbcc777的博客 508

多线程中 获取不到 @Autowired 和@Resource 注入的对象

多线程中 获取不到 @Autowired 和@Resource 注入的对象 老是提示空指针异常 可以使用工具类 手动获取改对象 工具类: package top.canye.sys.util; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.Applic...

haodiaoji9386的博客 569

java 线程类注入失败_详解SpringBoot 多线程处理任务 无法@Autowired注入bean问题解决...

在多线程处理问题时,无法通过@autowired注入bean,报空指针异常,在线程中为了线程安全,是防注入的,如果要用到这个类,只能从bean工厂里拿个实例。解决方法如下:1.创建一个工具类代码:package com.hqgd.pms.common;import org.springframework.beans.beansexception;import org.springframework...

weixin_32552195的博客 757

@Scope(BeanDefination.SCOPE_PROTOTYPE)在多线程环境下不能使用@Autowired或者@Resource注入

当类被@Scope(BeanDefination.SCOPE_PROTOTYPE)修饰时,说明每次依赖注入时,都会产生新的对象,具体可参见文章:http://blog.youkuaiyun.com/gst6062825/article/details/8765157 但是在多线程编程中,如果一个类被@Scope(BeanDefination.SCOPE_PROTOTYPE)修饰,且在另外的对象中如果需要引用此...

Laputa_Spring 1581

@Scope(“prototype“)失效,原因竟是lombok?

@Scope("prototype")失效,原因竟是lombok?

qq_43251337的博客 1018

@autowired 无法注入问题整理

今天突然有个朋友在写代码的时候问我,@autowired没注入,截图给我看。我看了看基本也没什么问题,结果截图业务逻辑的时候,居然是new的,肯定空指针 列举一般无法注入的情况(只针对spring,dubbo配置等不算在内): 1、spring boot项目启动类入口尽量放在顶级包下,spring会自动扫描子包以及子孙包的bean,基本不会存在无法注入的情况。普通spring项目配置...

程序员 9563

java无法注入_Java解决多线程无法@Autowired注入,手动获取Bean对象

Java解决多线程无法@Autowired注入,手动获取Bean对象问题当我们使用多线程时,又想注入一个service给我们使用,但是我们发现service总是为null。代码示例://例1public class TaskComments implements Callable> {//注入不进去,总是为null@Autowiredprivate RedisClient redisClie...

weixin_36466165的博客 1112
上一篇: linux根目录不足,追加空间到根目录
下一篇: CentOS6.9安装MySQL5.6
code_deliverer
博客等级 码龄9年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值