spring的javabean在注册后是单例模式,对于多线程中来讲并不是太好。但是线程中或多或少都需要调用一些service之类的bean。总结了下,有如下可以在线程中注入bean的方法。
注意:需要十分小心bean的全局变量,否则会有线程安全问题;
1.使用静态方法直接获取spring容器中的bean对象;
示例代码:
package demos.multiThreadDemo.untils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Locale;
/**
* <code>SpringContextUtil</code>
*
* @author zhuan.liu 17-1-14
* @version 1.0
*/
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext context = null;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContext act = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
context = act;
}
static {
ApplicationContext act = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
context = act;
}
public static <T> T getBean(String beanName) {
try {
return (T) context.getBean(beanName);
} catch (Exception e) {
System.out.println("SpringContextUtil" + e);
}
return (T) context.getBean(beanName);
}
public static String getMessage(String key) {
return context.getMessage(key, null, Locale.getDefault());
}
}
缺点:工程中的spring配置比较多,会出现bean注册不全或是冲突的情况,这个时候调试就显得比较繁琐;
2.设置线程局部变量,传入springbean;
3.将线程bean化;
4.ThreadLocal共享;