如何在线程中获取spring 管理的bean
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在线程中获取spring 管理的bean相关的知识,希望对你有一定的参考价值。
spring xml中定义<!--spring 工具类-->
<bean id="springContextUtil" class="com.skyline.pub.utils.SpringContextUtil"/>
SpringContextUtil的代码如下
package com.skyline.pub.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.util.Locale;
/**
* Spring 获取 bean工具类
* Author: skylinehttp://my.oschina.net/skyline520
* Created: 13-6-12 上午7:44
*/
public class SpringContextUtil implements ApplicationContextAware
private static ApplicationContext context = null;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
this.context = applicationContext;
public static <T> T getBean(String beanName)
return (T) context.getBean(beanName);
public static String getMessage(String key)
return context.getMessage(key, null, Locale.getDefault());
然后在线程中直接使用 (注: uploadService 为spring 中配置的bean)
@Override
public void run()
UploadService uploadService = SpringContextUtil.getBean("uploadService");
switch (sheetIndex)
case 1:uploadService.updateMiddleSaleProcedure(start,limit); break;
case 2:uploadService.updateProductCountProcedure();break;
case 3:uploadService.updateMonthProcedure();break;
countDownLatch.countDown();
参考技术A spring xml中定义 SpringContextUtil的代码如下 package com.skyline.pub.utils; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import java.util.Locale; /** * Spring 获取 bean工具类 * Author: skylinehttp://my.oschina.net/skyline520 * Created: 13-6-12 上午7:44 */ public class SpringContextUtil implements ApplicationContextAware private static ApplicationContext context = null; public void setApplicationContext(ApplicationContext applicationContext) throws BeansException this.context = applicationContext; public static T getBean(String beanName) return (T) context.getBean(beanName); public static String getMessage(String key) return context.getMessage(key, null, Locale.getDefault()); 然后在线程中直接使用 (注: uploadService 为spring 中配置的bean) @Override public void run() UploadService uploadService = SpringContextUtil.getBean("uploadService"); switch (sheetIndex) case 1:uploadService.updateMiddleSaleProcedure(start,limit); break; case 2:uploadService.updateProductCountProcedure();break; case 3:uploadService.updateMonthProcedure();break; countDownLatch.countDown(); 参考技术B 方法一:用Spring的方法获取到当前的容器(也是当前应用下唯一的spring容器),并从中获取资源。
方法二:可以通过在Action中创建Thread的时候把Action中的service引用作为构造参数传递给Thread,这样Thread中的Service对象就是通过SPring的自动注入得到的了。
在多线程中使用spring的bean
由于spring在java开发中的广泛运用大大的方便了开发的同时,当运用一些技术比如多线程等
在由spring管理的配置文件中,可以通过封装spring提供工具,手动获得spring管理的bean,这样
既可以方便使用bean,又可以同时使用其他技术。
可以方便的使用多种技术,而不至于由于使用spring导致不好用。
package com.jd.app.server.irp.service.task;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
* Created by liubaofeng on 2017/1/20.
*/
public class SpringBeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringBeanUtil.applicationContext = applicationContext;
}
public static Object getBeanByName(String beanName) {
if (applicationContext == null){
return null;
}
return applicationContext.getBean(beanName);
}
public static <T> T getBean(Class<T> type) {
return applicationContext.getBean(type);
}
}
spring xml中配置<bean id="springBeanUtil" class="com.jd.app.server.irp.service.task.SpringBeanUtil"/>
xml中配置很关键,因需要spring加载时感知,不配置取不到spring管理的bean。
相关连接
http://www.cnphp6.com/archives/135859
以上是关于如何在线程中获取spring 管理的bean的主要内容,如果未能解决你的问题,请参考以下文章
如何在手动获取spring中的bean(Spring ApplicationContextAware获取上下文)