Spring 多线程下注入bean问题详解
本文介绍了Spring多线程下注入bean问题详解,分享给大家,具体如下:
问题
Spring中多线程注入userThreadService注不进去,显示userThreadService为null异常
代码如下:
publicclassUserThreadTaskimplementsRunnable{
@Autowired
privateUserThreadServiceuserThreadService;
@Override
publicvoidrun(){
AdeUseruser=userThreadService.get("0");
System.out.println(user);
}
}
解决方案一
把要注入的Service,通过构造传过去,代码如下:
publicclassUserThreadTaskimplementsRunnable{
privateUserThreadServiceuserThreadService;
publicUserThreadTask(UserThreadServiceuserThreadService){
this.userThreadService=userThreadService;
}
@Override
publicvoidrun(){
AdeUseruser=userThreadService.get("0");
System.out.println(user);
}
}
Threadt=newThread(newUserThreadTask(userThreadService)); t.start();
解决方案二
通过ApplicationContext中获取需要使用的Service
importorg.springframework.beans.BeansException;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.ApplicationContextAware;
publicclassApplicationContextHolderimplementsApplicationContextAware{
privatestaticApplicationContextcontext;
@Override
publicvoidsetApplicationContext(ApplicationContextcontext)throwsBeansException{
ApplicationContextHolder.context=context;
}
//根据beanname获取实例
publicstaticObjectgetBeanByName(StringbeanName){
if(beanName==null||context==null){
returnnull;
}
returncontext.getBean(beanName);
}
//只适合一个class只被定义一次的bean(也就是说,根据class不能匹配出多个该class的实例)
publicstaticObjectgetBeanByType(Classclazz){
if(clazz==null||context==null){
returnnull;
}
returncontext.getBean(clazz);
}
publicstaticString[]getBeanDefinitionNames(){
returncontext.getBeanDefinitionNames();
}
}
Spring加载自己定义的ApplicationContextHolder类
根据bean的名称获取实例
UserServiceuser=(UserService)ApplicationContextHolder.getBeanByName("userService");
根据bean的Class获取实例(如果该Class存在多个实例,会报错的)
UserServiceuser=(UserService)ApplicationContextHolder.getBeanByType(UserService.class);
这种方式,不管是否多线程,还是普通的不收spring管理的类,都可以使用该方法获得spring管理的bean。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。