java(多)线程中注入Spring的Bean
问题描述 项目中很多地方都用到了异步方式或多线程,也就是开启新线程处理一些业务。在新线程中,用spring注解@Autowire注入Bean会抛出nullPointerException,也就是Spring Bean没有被注入,bean对象的值为null。原因分析  
·
问题描述
项目中很多地方都用到了异步方式或多线程,也就是开启新线程处理一些业务。在新线程中,用spring注解@Autowire注入Bean会抛出nullPointerException,也就是Spring Bean没有被注入,bean对象的值为null。
原因分析
web容器在启动应用时,并没有提前将线程中的bean注入
解决方案
使用静态方法直接取的容器中的spring对象
1. 定义工具类如下,并且需要配置成spring中的bean:
/**
* 获取spring对象的工具类
*/
@Component
public class FrameSpringBeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
applicationContext = arg0;
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {
return (T) applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> cls) {
return applicationContext.getBean(cls);
}
}
2. 线程中获取bean:
final WmsOrderService wmsOrderService = FrameSpringBeanUtil.getBean(WmsOrderService.class);
更多推荐
已为社区贡献3条内容
所有评论(0)