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的方法也可能是代码的结构设计时考虑的不够周全才造成了现在的情况。如果之后有了新的想法,随时来修改
时间: 2024-10-24 18:05:29