spring 另开线程时的注入问题
spring web项目在启动的时候,就会完成各种组件的注入。在工作的过程中,遇到了这样一个问题:
一个serviceA中要新开一个线程来执行一项任务(假定这个任务是ClassA)。ClassA中要用到其他serviceB,serviceC的一些功能。所以在ClassA中声明了要用的serviceB serviceC变量。
一开始采用了简单的@Autowired注解来进行注入。但是在用junit测试的时候报错,service变量为null。
上网查询后了解到,由于这个ClassA是我们 new Thread(new ClassA()).start() 创建的。里面是没有办法进行注入的,不被spring容器管理。所以有以下几个方法:
1.在ClassA中获得ApplicationContext 然后调用getbean方法来获得需要的service bean(此方法需要实现ApplicationContextAwareness 接口。实现获得ApplicationContext对象)
2.通过构造函数注入。也就是new ClassA(service1,service2) 这样将serviceA中注入的服务传入。
3.通过setter注入,也就是 new ClassA().setService1(service1) ,实际和2没什么区别。
目前看到的主要是这几种方法。
个人的感觉是,实现功能才是最重要的,不能为了看起来漂亮强行用注入(因为注入实现不了,当然也可能是因为知识缺乏)。需要的时候,使用构造函数也是可以的。
由于工作经验比较少,这种多线程中调用外部service的方法也可能是代码的结构设计时考虑的不够周全才造成了现在的情况。如果之后有了新的想法,随时来修改
spring 另开线程时的注入问题的更多相关文章
- 160309、Spring AOP操作action时无法注入,报空指针错误
今天帮同事看个问题,action注入失败,代码没问题,主要是stuts2权限移交的问题,特此记录一下 Spring AOP操作action时无法注入,报NullPointer异常 当使用Spring ...
- Spring AOP操作action时无法注入,报NullPointer异常
Spring AOP操作action时无法注入,报NullPointer异常当使用Spring AOP对action层进行操作时,会出现注入失败的问题,出现空指针异常.原因是一般struts2+spr ...
- spring中使用quartz时注入时出现的错误
错误1: 配置文件: <!-- 任务执行器的线程池 --> <bean id="taskExecutor" class="org.springframe ...
- Spring Boot 整合mybatis时遇到的mapper接口不能注入的问题
现实情况是这样的,因为在练习spring boot整合mybatis,所以自己新建了个项目做测试,可是在idea里面mapper接口注入报错,后来百度查询了下,把idea的注入等级设置为了warnin ...
- Spring与Struts2整合时action自动注入的问题
当Struts和Spring框架进行整合时,原本由action实例化对象的过程移交给spring来做(这个过程依赖一个叫struts2-spring-plugin的jar包,这个包主要的功能就是实现刚 ...
- Spring中的线程池和定时任务功能
1.功能介绍 Spring框架提供了线程池和定时任务执行的抽象接口:TaskExecutor和TaskScheduler来支持异步执行任务和定时执行任务功能.同时使用框架自己定义的抽象接口来屏蔽掉底层 ...
- spring(3)------控制反转(IOC)/依赖注入(DI)
一.spring核心概念理解 控制反转: 控制反转即IoC (Inversion of Control).它把传统上由程序代码直接操控的对象的调用权交给容器.通过容器来实现对象组件的装配和管理. 所谓 ...
- Spring IoC是如何进行依赖注入的
依赖注入(DI) DI(Dependency Injection),Spring IoC 不是一种技术,而是一种思想,通过这种思想,能够指导我们设计出松耦合的程序代码.而Spring IoC这个思想的 ...
- Spring单例模式与线程安全
问题背景 这段时间在做项目的时候,考虑到Spring中的bean默认是单例模式的,那么当多个线程调用同一个bean的时候就会存在线程安全问题.如果是Spring中bean的创建模式为非单例的,也就不存 ...
随机推荐
- Caffe初试(二)windows下的cafee训练和测试mnist数据集
一.mnist数据集 mnist是一个手写数字数据库,由Google实验室的Corinna Cortes和纽约大学柯朗研究院的Yann LeCun等人建立,它有60000个训练样本集和10000个测试 ...
- Spring MVC基础入门
Spring MVC简介 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱 ...
- VS2012下X64平台嵌入汇编程序
VS2012在win32平台编译的时候可以很好的支持汇编语言的嵌入.建立一个控制台应用程序,选择空项目.项目建立好之后添加一个.cpp文件.在cpp文件中写入如下代码: #include <io ...
- Eclipse - 常用插件介绍
1.MyBatis Generator 2.FindBugs Feature http://findbugs.cs.umd.edu/eclipse 待完善.
- android 无限循环的viewpager
思路 例如存在 A -B -C 需要在viewpager滑动时无限循环 1.我们可以设计 C' A B C A' C'与C相同,A'与A相同 2.滑动到A'时,则index回到1 3.滑动到C'时, ...
- idapython在样本分析中的使用-字符解密
最近接手的一个样本,样本中使用了大量的xor加密,由于本身样本不全,无法运行(好吧我最稀饭的动态调试没了,样本很有意思,以后有时间做票大的分析),这个时候就只好拜托idapython大法了(当然用id ...
- 如何在插件中添加Actor类
只要按照BlueprintFunctionLibrary的那个模板做就好了,把用编辑器生成的代码复制到插件对应的目录 之后需要注意做以下修改 1.H文件中的 GENERATED_UCLASS_BODY ...
- BZOJ2454 : TopCoder SRM 463 RabbitPuzzle
每种状态最多只有三种后继状态:中间往左跳,中间往右跳,两边往中间跳. 如果把它们分别看成左儿子.右儿子.父亲的话,那么会得到一些二叉树. 取出起始状态和终止状态往上跳$k$步的所有状态,其他状态我们只 ...
- Django分析之如何自定义manage命令
我们都用过Django的manage.py的命令,而manage.py是在我们创建Django项目的时候就自动生成在根目录下的一个命令行工具,它可以执行一些简单的命令,其功能是将Django proj ...
- Predicate<T>与Func<T, bool>泛型委托
引用别人的: static void Main(string[] args) { List<string> l = new List<string>(); l.Add(&quo ...