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