Spring在多线程下@Resource注入为null的问题
作者:Healist 发布时间:2022-09-11 07:41:18
多线程下@Resource注入为null
前情叙述
记录以下这个坑,我的情况大致是这样的,我在用webmagic写爬虫,在类中通过@Resoource(@Autowired也一样)注入dao接口实例。
然后我在process方法中引用这个实例发现这个实例在这里一直为null,然后我在测试类或者当前类的main函数中引用dao实例就没问题,一切正常(当时 黑人问号脸???)
几经波折,发现原因是spring和多线程安全的问题,不让注入。因为我也没研究过webmagic源码,不过我个人觉得跟webmagic没有与spring容器相关联可能很有关系,
解决方案
我用的是很简单暴力的方法,spring不让自动注入,那就手动注入呗,在process方法中通过ApplicationContext获取对应那个dao bean实例,然后可以了。
附上其它解决
就是我用@service或者@resposity声明了一个bean,给sping管理。现在我有个需求,就是用到Thread,但是这个线程需要用我的service或者dao,然后我习惯性的在继承了Thread类或者实现了Runnable的类里写了如下:
@Resource
private MyService myService;
但是运行的时候,进入到这个线程,这个myServcie总为null,也就是注入失败。
1.查了一下,有这样的问题,原因就是spring和多线程安全的问题,不让注入
网上的解决方案说,声明时弄成static的。如下:
private static CustomerchangeService customerchangeService;
public CustomerchangeService getCustomerchangeService() { return customerchangeService; }
public void setCustomerchangeService( CustomerchangeService customerchangeService) { CustomerchangeThread.customerchangeService = customerchangeService; }
不过我这样行不通。
2.第二种(可以)
就是我在启动这个线程的时候,在这个线程的构造函数中把我的service实例传过去,然后再启动。
new MyThread(myService).start()
3.第三种(可以)
就是让我的service或者dao的实现类实现Runnable这个接口,然后把你的线程的逻辑写在run方法里,启动的时候,直接this.start()就行。注意除了要在service的实现类中实现Runnable接口外,还应该在service接口中继承Runnable接口。
对于我的情况,我是直接在dao里实现了Runnable,然后用的线程池启动的,如下:pool.execute(this);
4.还有就是直接new一个实例。
不知道还有什么解决的好办法。
来源:https://blog.csdn.net/Healist/article/details/54791195


猜你喜欢
- 改进思考正常实现流程应该为继承ClassLoader虚拟类,并重写其loadClass方法和findClass方法,并在loadClass方
- 1、为什么需要自定义ViewAndroid系统内置的View不满足我们的业务需求2、自定义View的基本方法onMeasure:决定着Vie
- 一、前言canal:阿里巴巴 MySQL binlog 增量订阅&消费组件https://github.com/alibaba/ca
- 看了Android版QQ的自定义头像功能,决定自己实现,随便熟悉下android绘制和图片处理这一块的知识。先看看效果:思路分析:这个效果可
- 前言为什么用动静态库我们在实际开发中,经常要使用别人已经实现好的功能,这是为了开发效率和鲁棒性(健壮性);因为那些功能都是顶尖的工程师已经写
- 简介简单的文本编译器,可以通过弹出对话框打开文件,进行编写并保存文件。代码package Code.a;import java.io.*;i
- 本文实例为大家分享了java实现超市管理系统的具体代码,供大家参考,具体内容如下一、使用技术javaSE二、实现功能超市管理系统具体要求如下
- private string CheckCidInfo(string cid) &
- Android安装apk文件并适配Android 7.0详解首先在AndroidManifest.xml文件,activity同级节点注册p
- 1.导入 EasyExcel Maven包<!--easyexcel 导出excel依赖--><dependency>
- 系列文章已完成,目录如下:jdk-logging log4j logback日志系统实现机制原理介绍commons-lo
- Java单例模式的实现,对java 单例模式的几种实现方法进行了整理:单例模式好多书上都是这么写的:public class SingleT
- refresh()该方法是 Spring Bean 加载的核心,它是 ClassPathXmlApplicationContext 的父类
- 介绍Tuple是异类对象的有序序列。 我们经常可以写出返回多个值的方法,所以我们需要创建一个包含多个数据元素的简单结构。 为了支持这些情况,
- java调用外部程序的方法 在一个java应用中,可能会遇到这样的需求,就是需要调用一些外部的应用做一些处理,比如调用excel,
- Spring-Context的作用spring-context提供应用程序上下文,这是Spring的依赖注入容器,它可能总是在以某种方式使用
- 前言:在我们使用C# WinForm中,我们有时候是需要或者自己本机的IP地址进行处理,今天我们学习一下如何使用C# Winform获取主机
- java超市管理系统 1.0(含源文件,后续会继续优化~)前言一个月零零散散的时间学习了java,通过这次“超市管理系统”的练习,希望可以给
- 贪婪量词:先看整个字符串是不是一个匹配。如果没有发现匹配,它去掉最后字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么 
- 一、TestNG介绍TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit, 功能都差不多, 只是功能更加强大,使用也更方