Java(多)线程中注入Spring的Bean
问题说明 :
今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入,bean对象的值为null。
原因分析 :
web容器在启动应用时,并没有提前将线程中的bean注入(在线程启动前,web容易也是无法感知的)
解决方案 :
线程中获取bean
import org.springframework.context.ApplicationContext;
public class ServiceFactory {
public static ApplicationContext context=null;
public static Object getInstance(String serviceName){
if (null==context) {
context=ApplicationContextLoaderListener.getApplicationContext();
}
return context.getBean(serviceName);
}
}
@Override
public void run() {
// 记录推荐记录
GfRegistrationService gfRegistrationService =
(GfRegistrationService) ServiceFactory.getInstance("gfRegistrationService");
List<GfRegistration> insertRegistrationlist = this.getGfRegistrationlist();
if (insertRegistrationlist.size() > 0) {
int[] resultArry = gfRegistrationService.batchInsert(insertRegistrationlist);
if (resultArry.length > 0) {
logger.info("信息批量记录", "批量记录信息,length= " + resultArry.length);
} else {
logger.info("信息批量记录", "推荐商户信息为空");
}
}
}