需求:在Action中启动一个Thread去做一件事,因项目是通过spring的自动注入的Bean之前的依赖关系,在线程中的Service引用始终无法得到对象,即使是new出来的,可Service中的Dao引用又是null的。
方法一:用Spring的方法获取到当前的容器(也是当前应用下唯一的spring容器),并从中获取资源。
参考代码1:
WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
IService service = (IService) context.getBean("service");
参考代码2:
spring xml中定义
1<!--spring 工具类-->
2<beanid="springContextUtil"class="com.skyline.pub.utils.SpringContextUtil"/>
SpringContextUtil的代码如下
01packagecom.skyline.pub.utils;
02
03importorg.springframework.beans.BeansException;
04importorg.springframework.context.ApplicationContext;
05importorg.springframework.context.ApplicationContextAware;
06
07importjava.util.Locale;
08
09/**
10* Spring 获取 bean工具类
11* Author: skyline{http://my.oschina.net/skyline520}
12* Created: 13-6-12 上午7:44
13*/
14publicclassSpringContextUtil implementsApplicationContextAware {
15
16privatestaticApplicationContext context = null;
17publicvoidsetApplicationContext(ApplicationContext applicationContext) throwsBeansException {
18this.context = applicationContext;
19}
20
21publicstatic<T> T getBean(String beanName){
22return(T) context.getBean(beanName);
23}
24
25publicstaticString getMessage(String key){
26returncontext.getMessage(key, null, Locale.getDefault());
27}
28
29}
然后在线程中直接使用 (注: uploadService 为spring 中配置的bean)
01@Override
02publicvoidrun() {
03UploadService uploadService = SpringContextUtil.getBean("uploadService");
04switch(sheetIndex){
05case1:uploadService.updateMiddleSaleProcedure(start,limit); break;
06case2:uploadService.updateProductCountProcedure();break;
07case3:uploadService.updateMonthProcedure();break;
08}
09countDownLatch.countDown();
10}
方法二:可以通过在Action中创建Thread的时候把Action中的service引用作为构造参数传递给Thread,这样Thread中的Service对象就是通过SPring的自动注入得到的了。
01packagecom.skyline.upload.listener;
02
03importorg.springframework.beans.factory.InitializingBean;
04
05/**
06* 这个类可以注入一些 dao 工具类
07* 在 afterPropertiesSet 方法中执行数据库连接级别的操作
08* Author: skyline{http://my.oschina.net/skyline520}
09* Created: 13-6-12 下午7:41
10*/
11publicclassUploadOnLoadListener implementsInitializingBean {
12
13privateCommandTextService commandTextService;
14
15publicvoidsetCommandTextService(CommandTextService commandTextService) {
16this.commandTextService = commandTextService;
17}
18
19publicvoidclose(){
20}
21publicvoidafterPropertiesSet() throwsException {
22//在这里启动你的线程
23//方式1 利用构造方法把bean传递过去
24newThread(commandTextService);
25//方式2 在thread 内部使用我之前说的获取bean的方式
26newThread();
27}
28}
转载于:https://blog.51cto.com/tao975/1357648