在多线程中注入Spring Bean

  一个 Web 项目的Socket需用到多线程,每一个连接创建一条线程来处理数据。
  在多线程中需要用到 Spring 中的 Bean,如果直接用 Spring 注入是会报NullPointerException错误。原因是线程类无法提前委托给Spring管理,是在使用中创建的。

工具类

  创建一个获取Bean的工具类,获取ApplicationContext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext context = null;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}

// 获取对象 这里重写了bean方法,起主要作用
@SuppressWarnings("unchecked")
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());
}
}

工具类交给Spring管理

1
2
<!-- 注册Spring工具类 -->
<bean id="springContextUtil" class="com.commons.SpringContextUtil" ></bean>

在线程中获取业务Bean

1
2
3
4
5
6
7
public class ThreadSocket implements Runnable {
private DeviceService deviceService = SpringContextUtil.getBean("deviceServiceImpl");
private GoodsService goodsService = SpringContextUtil.getBean("goodsServiceImpl");

........

}
作者

光星

发布于

2018-01-10

更新于

2022-06-17

许可协议

评论