問題說明 :
今天在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("信息批量記錄", "推薦商戶信息爲空");
}
}
}