1. 程式人生 > >Java多執行緒中Spring的Bean注入失敗

Java多執行緒中Spring的Bean注入失敗

問題說明 : 

在spring框架進行專案開發,平時遇到了需要批量處理的資料的時候,會選擇多執行緒進行資料批跑,但是會發現,啟動多執行緒後,執行緒會出現service或者mapper檔案注入失敗的問題,導致執行緒啟動失敗,其中bean的注入方式選擇的是spring常規的註解@Autowired進行注入

原因分析 :

web容器在啟動應用時,spring容器是無法感知多執行緒的那些bean的,所以多執行緒的bean類無法獲取spring容器的上下文,並不能通過@Autowired注入需要的bean

解決方案 :

執行緒中獲取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);
	}
}
public class CardThread extends Thread{
	@Autowired
	private FinanceCardDoMapper financeCardDoMapper;
	
	private Integer startIndex;
	private Integer endIndex;
	private List<FinanceCardDo> dataList;
	public CardThread(Integer startIndex ,Integer endIndex ,List<FinanceCardDo> dataList) {
		super();
		this.startIndex = startIndex; 
		this.endIndex = endIndex; 
		this.dataList = dataList; 
	}
	public void run(){
		financeCardDoMapper = (FinanceCardDoMapper)MyBatisConfig.getApplicationContext().getBean(FinanceCardDoMapper.class);
		for (FinanceCardDo financeCardDo : dataList) {
			if (financeCardDo.getIndex() > startIndex && financeCardDo.getIndex() <= endIndex) {
				financeCardDo.setCardNo(DesUtil.encrypt("dfsghjkl",financeCardDo.getCardNo()));
				financeCardDo.setBankMobile(DesUtil.encrypt("dfsghjkl",financeCardDo.getBankMobile()));
				financeCardDoMapper.updateByPrimaryKeySelective(financeCardDo);
				System.out.println("該使用者銀行卡更新完成:index:" + financeCardDo.getIndex());
			}
		}
	}
}




相關推薦

Java執行Spring的Bean注入失敗

問題說明 : 在spring框架進行專案開發,平時遇到了需要批量處理的資料的時候,會選擇多執行緒進行資料批跑,但是會發現,啟動多執行緒後,執行緒會出現service或者mapper檔案注入失敗的問題,導致執行緒啟動失敗,其中bean的注入方式選擇的是spring常規的註解@A

Java執行注入Spring的Bean-使用靜態方法直接取的容器的spring物件

目前認為比較好的解決方案。 1,工具類 public class SpringApplicationContextHolder implements ApplicationContextAware { private static ApplicationContext context

Java執行Synchronized簡介和Static Synchronized的區別

在進行Java開發時,多執行緒的開發是經常會使用的。首先會問一個小問題啊,在Java中有幾種方法可以建立一個執行緒? 我給的答案是3種。(如果還有其他的請留言告訴我哈。) 1、建立直接繼承自Thread類建立執行緒子類。   步驟如下:a 定義一個子類,同時

java執行的異常處理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java執行顯式鎖的輪詢檢測策略

顯式鎖簡介 java5.0之前,在協調對共享物件的訪問時可以使用的機制只有synchronized和volatile,java5.0增加了一種新的機制:ReentrantLock。 鎖像synchronized同步塊一樣,是一種執行緒同步機制,與synchronized不同的是ReentrantLock提

白話理解java執行join()方法

join字面意思是加入,我理解為插隊. 舉例:媽媽在炒菜,發現沒喲醬油了,讓兒子去打醬油,兒子打完醬油,媽媽炒完菜,全家一起吃 package cn.yh.thread01; /** * *

Java執行volatile的場景應用

一、場景簡述 筆者在看多執行緒通訊相關問題時,不使用等待/通知機制實現多執行緒通訊的時候,發現b執行緒沒有與a執行緒發生正常通訊。 二、場景實現 如下是未發生正常通訊的程式碼 1、MyList類 package waitnotify; import java.ut

ArrayList在Java執行的應用

ArrayList是非執行緒安全的。 問題描述 開發中,存在這樣的業務邏輯,類似倒金字塔結構,下層資料需要基於上層的資料進行邏輯計算。設計思路是:定義一個全域性變數upLayerList,來儲存上一層的資料。每一層計算僅需要知道upLayerLi

Java執行start()和run()的區別

Java的執行緒是通過java.lang.Thread類來實現的。VM啟動時會有一個由主方法所定義的執行緒。可以通過建立Thread的例項來建立新的執行緒。每個執行緒都是通過某個特定Thread物件所對應的方法run()來完成其操作的,方法run()稱為執行緒體。通過呼叫Thread類的start(

java執行的sleep()、wait()、notify()和物件鎖的關係

1、sleep()不釋放物件鎖。 2、wait()釋放物件鎖。 3、notify()不釋放物件鎖。 (1)、notify釋放鎖嗎?不要誤導別人。notifty()只是喚醒此物件監視器上等待的單個執行緒,直到當前執行緒釋放此物件上的鎖,才有可能繼續執行被喚醒的執行緒。 (2)

JAVA執行join()方法的詳細分析

雖然關於討論執行緒join()方法的部落格已經非常極其特別多了,但是前幾天我有一個困惑卻沒有能夠得到詳細解釋,就是當系統中正在執行多個執行緒時,join()到底是暫停了哪些執行緒,大部分部落格給的例子看起來都像是t.join()方法會使所有執行緒都暫停並等待t的執行完畢。當然

Java執行的final和static

看Android的多執行緒發現其實是Java的多執行緒。我找了一本Java程式設計思想學習Java的併發機制。寫了一個demo,遇到一些問題,雖然最後想明白了,但是也暴露了我的Java基礎差勁的事實。之後我會通過寫部落格的方式來提高Java水平。現在說一下我的問

Java執行的記憶體模型

1)多執行緒執行下的記憶體模型:JVM中規定了所有變數都儲存在主記憶體中,然後每條執行緒有自己的工作記憶體。執行緒的工作記憶體中儲存了該執行緒需要用到的變數的拷貝值,執行緒在CPU上執行時都是對自己工作執行緒中的資料進行讀寫操作,執行結束之後才把資料同步化主記憶體中。那麼資料一致性協議、資料一致性問題,JVM

Java執行避免在生產者和消費者場景出現假死

在多執行緒程式設計中,如果所有執行緒全部都經由wait()方法進入等待狀態,那麼程式就進入了假死狀態 程式示例 考慮這個例子,來自《Java多執行緒程式設計核心技術》: 生產者類P: //生產者 public class P { private Stri

Java 執行的任務分解機制-ForkJoinPool詳解

一、任務分解問題和ForkJoinPool簡介        在多執行緒併發程式設計中,有時候會遇到將大任務分解成小任務再併發執行的場景。Java 8新增的ForkJoinPool很好的支援了這個問題

Java執行的volatile變數

首先,volatile的作用是保證記憶體的可見性,但是不能保證操作的原子性。 在Java中記憶體模型中,將記憶體模型分為主記憶體和工作記憶體。 主記憶體是對所有執行緒所共享的,而每個執行緒都有自己的工作記憶體(比如cpu快取,暫存器等等都是一個原理的,都是為了加快讀取速度),工作記憶

Java執行join方法的理解

[CustomThread1] Thread start.      //執行緒CustomThread1起動 [CustomThread1] Thread loop at 0   //執行緒CustomThread1執行 [CustomThread1] Thread loop at 1   //執行緒Cu

Java執行static變數的使用 SimpleDateFormat時間格式化存線上程安全問題

兩篇文章 Java多執行緒中static變數的使用  (轉自:http://blog.csdn.net/yy304935305/article/details/52456771) &&  SimpleDateFormat時間格式化存線上程安全問題

java執行關於join方法的使用

Thread的非靜態方法join()讓一個執行緒B“加入”到另外一個執行緒A的尾部。在A執行完畢之前,B不能工作。例如:         Thread t = new MyThread();         t.start();         t.join(); 另外,j

java執行常用的執行幫助類

java.util.concurrent 類 Exchanger<V> java.lang.Object java.util.concurrent.Exchanger<V> 型別引數:V - 可以交換的物件型別public class Exc