spring 另开线程时的注入问题
2016-05-15 23:16
337 查看
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的方法也可能是代码的结构设计时考虑的不够周全才造成了现在的情况。如果之后有了新的想法,随时来修改
一个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的方法也可能是代码的结构设计时考虑的不够周全才造成了现在的情况。如果之后有了新的想法,随时来修改
相关文章推荐
- eclipse调试多线程
- java中NIO总结
- Eclipse搭建SSH(Struts2+Spring3+Hibernate3)框架项目教程
- java 抽象类与接口的区别 整理
- Spring MVC事务配置
- spring之依赖注入与控制反转的区别
- java中集合的接口和类
- Java文件与IO(三)之缓冲流
- JAVA聊天室(2)
- 基于Java的Heritrix爬取网页
- Java虚拟机详解----GC算法和种类【重要】
- java web笔记——JSP
- eclipse常用快捷键自我总结
- Java 1.5并发包之三:线程池实现之Fork/Join框架
- java 反射
- java.io.File类中mkdir()与mkdirs()区别
- Java NIO系列教程(一) Java NIO 概述
- 在eclipse中搭建struts2开发环境
- Java基础--数据库连接方式
- Java虚拟机详解----JVM常见问题总结