1. 程式人生 > >多執行緒時Autowired自動注入問題

多執行緒時Autowired自動注入問題

首先需要知道的是,容器中的元件,也就是你添加了諸如@Component , @Service , @Controller以及@Repository等等註解,在容器啟動的時候是會掃描標註這些註解的類建立bean並放入容器中。

如果該類中的成員變數上使用了諸如@Autowired和@Resource註解時,容器將會找對應的bean並注入–依賴注入。

而在多執行緒例項中使用@Autowired註解有時得不到物件,為什麼呢?

執行緒類例項如下:

@Component
public class TestThread extends Thread{

    private static final
Logger log = LoggerFactory.getLogger(TestThread.class); @Autowired ISysBoundUserExtendDao boundUserExtendDao; @Autowired SysBoundUserMapper boundUserMapper; int pageBegin; int pageEnd; public TestThread( int pageEnd,int pageBegin) { super(); this.pageEnd = pageEnd; this
.pageBegin = pageBegin; log.debug("pageBegin : "+pageBegin+" , pageEnd : "+pageEnd); } public TestThread() { super(); } public TestThread(ISysBoundUserExtendDao boundUserExtendDao, SysBoundUserMapper boundUserMapper, int pageEnd, int pageBegin) { super
(); this.boundUserExtendDao = boundUserExtendDao; this.boundUserMapper = boundUserMapper; this.pageEnd = pageEnd; this.pageBegin = pageBegin; log.debug("pageBegin : "+pageBegin+" , pageEnd : "+pageEnd); } public void run(){ String result = ""; Integer pageSize=1000; Map<String, Object> queryMap = new HashMap<>(); for(int i=pageBegin;i<pageEnd;i++){ queryMap.put("page", i); queryMap.put("pageSize", pageSize); log.debug("開始獲取第"+i+"頁使用者..."); List<SysBoundUser> boundUserList = boundUserExtendDao.getBoundUserList(queryMap); //... } } }

使用了@Component和@Autowired註解。

此時建立多執行緒如下:

    @RequestMapping(value="checkUser2",produces="application/json;charset=utf-8")
    @ResponseBody
    public String checkUser2(){
        String result = "";
        TestThread testThread1 = new TestThread(4, 3);
        testThread1.start();
        TestThread testThread2 = new TestThread( 5, 4);
        testThread2.start();
        TestThread testThread3 = new TestThread(6, 5);
        testThread3.start();
        TestThread testThread4 = new TestThread(7, 6);
        testThread4.start();
        TestThread testThread5 = new TestThread(8, 7);
        testThread5.start();
        return result;
    }

會發現,在run()方法中boundUserExtendDao為null!!!

這是因為建立多執行緒時,是new的物件例項,非容器掃描時自動建立的物件例項!!!而你建立執行緒的時候並沒有傳入boundUserExtendDao。

如果獲取的是容器建立的TestThread,那麼肯定有mapper和dao:

這裡寫圖片描述

那麼如何在多執行緒中使用boundUserExtendDao呢?

答:建立的時候傳入boundUserExtendDao例項!

例項如下,此時run方法中可以正確拿到mapper和dao:

@Controller
@RequestMapping("/test")
public class TestDataController {

    private static final Logger log = LoggerFactory.getLogger(TestDataController.class);

    @Autowired
    ISysBoundUserExtendDao boundUserExtendDao;

    @Autowired
    SysBoundUserMapper boundUserMapper;


    @RequestMapping(value="checkUser2",produces="application/json;charset=utf-8")
    @ResponseBody
    public String checkUser2(){
        String result = "";
        TestThread testThread1 = new TestThread( boundUserExtendDao, boundUserMapper,4, 3);
        testThread1.start();
        TestThread testThread2 = new TestThread( boundUserExtendDao, boundUserMapper,5, 4);
        testThread2.start();
        TestThread testThread3 = new TestThread(boundUserExtendDao, boundUserMapper, 6, 5);
        testThread3.start();
        TestThread testThread4 = new TestThread(boundUserExtendDao, boundUserMapper, 7, 6);
        testThread4.start();
        TestThread testThread5 = new TestThread(boundUserExtendDao, boundUserMapper, 8, 7);
        testThread5.start();
        return result;
    }

相關推薦

執行Autowired自動注入問題

首先需要知道的是,容器中的元件,也就是你添加了諸如@Component , @Service , @Controller以及@Repository等等註解,在容器啟動的時候是會掃描標註這些註解的類建立bean並放入容器中。 如果該類中的成員變數上使用了諸如@A

SimpleDateFormat時間格式化高併發、執行出現問題

SimpleDateFormat是是 Java 中一個非常常用的類,該類用來對日期字串進行解析和格式化輸出,但是DateFormat 和 SimpleDateFormat 類不都是執行緒安全的,在生產環境的多執行緒或高併發情況使用 format() 和 parse() 方法,會出現很多問題:

Junit測試執行遇到的問題

問題的產生 這個問題是我在做支付寶自動對賬功能時發現的,因為支付寶對賬介面下載的對賬單是zip壓縮檔案形式返回的,所以要實現自動對賬功能需要在我呼叫支付寶對賬介面下載完zip檔案之前先啟動一個執行緒去監控我用於存放zip檔案的資料夾,當這個資料夾有zip檔案生成時,自動觸發“解壓”方法

執行之失敗自動重試機制

發現一個比較好玩的東西: 如果你在使用多執行緒的使用中異常結束了,你應該如何操作呢? 例子: 正常情況下: 專案一啟動都可以跑完,如果有一段程式碼出現錯誤呢。 系統丟出了一個異常出來。 有沒有發生過這樣的情況,你寫的工作執行緒莫名其妙的掛了,如果不是被你剛好看到,拿只能抓瞎了,不知道啥原因了,因為異常

執行的資料庫連線資源佔用問題

MICROSOFTSPEECHPLATFORM11WITHOUTTHEMOSTIMPORTANTDLLMICROSOFTSPEECHPLATFORM11WITHOUTTHEMOSTIMPORTANTDLLMICROSOFTSPEECHPLATFORM11WITHOUTTHEM

建立執行,為何建立後需要Sleep?

後面的執行緒用到了前面執行緒初始的結構,sleep一下只是做到了使前一個執行緒初始化完成後後一個執行緒才開始執行。但這樣不嚴格,需要同步機制。在麼多個執行緒都要用的資料結構不要放到子執行緒內部去初始化,程式啟動時全部初始化好。

坑一 執行執行執行CPU滿負荷

package Thread_study; public class SynFunLockDemo { public static void main(String[] args) { TicketDemo p = new T

控制檯應用執行執行輸出控制

現在用C++實現多執行緒已經不是難事。但是,在控制檯應用中實現多執行緒時,各執行緒的輸出控制就是一個問題,如果處理不好,由於執行緒的CPU資源是搶佔式的,輸出會亂七八糟。對此,我們可以使用條件迴圈來控制,一下給出一個例子,找到兩個範圍內能被2,3,5,7整除的數

Android執行下載APk+自動安裝

DialogUtils import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.con

使用springboot2執行執行類無法實現自動注入需要的bean

1、情況描述 使用springboot2多執行緒,執行緒類無法實現自動注入需要的bean,解決思路,通過工具類獲取需要的bean 如下 package com.ps.uzkefu.apps.ctilink.handler; import com.baomidou.mybati

十、JAVA執行:JVM類載入器(自動類載入器、雙親委託機制、類載入器名稱空間、執行包、類的解除安裝等)

  Jvm提供了三大內建的類載入器,不同的類載入器負責將不同的類載入到記憶體之中 根載入器(Bootstrap ClassLoader) 是最頂層的載入器,是由C++編寫的,主要負責虛擬機器核心類庫的載入,如整個java.lang包,根載入器是獲取不到引用的,因此

beginthreadex()函式在建立執行傳入回撥函式,好像只能傳入全域性函式或類的靜態成員函式,請問能不能傳入類的成員函式呢(非靜態)?

C++類成員函式直接作為執行緒回撥函式2009年06月01日 星期一 17:01我以前寫執行緒時要麼老老實實照著宣告寫,要麼使用C++類的靜態成員函式來作為回撥函式,經常會因為執行緒程式碼而破壞封裝.之前雖然知道類成員函式的展開形式,但從沒想過利用過它,昨天看深入ATL時無意中學

利用Python執行限制 http 真實請求間或限制函式最大執行時間的裝飾器

  這段時間在製作一個爬蟲的時候發現了一個比較神奇的事情 python requests 包發起請求的時候設定 timeout 引數 竟然不起作用? what 你要弄啥么蛾子嘞,  後來各種找原因終於在別人的提醒下又看了下 requests 的文件才發

如何在執行執行注入bean

轉:https://segmentfault.com/q/1010000007172414?_ea=1264473 如何在多執行緒中注入bean?!​​​​​​​ 問題對人有幫助,內容完整,我也想知道答案0問題沒有實際價值,缺少關鍵內容,沒有改進餘地 前幾天,在sf這裡也提過這個問題,但

Python工(利用threading建立執行傳入引數--args引數)

  target  : 指定 這個執行緒去哪個函式裡面去執行程式碼   args:     指定將來呼叫 函式的時候   傳遞什麼資料過去         &n

【面試題】執行執行過程中,某個執行執行,突然釋放鎖。會發生的特殊狀態

一,背景 今天在刷面試題的時候,做到一道面試題,雖然看了答案,但有一個答案還是不理解。後來研究了一下,得到結論:執行緒拿到鎖進行執行時,哪怕獲得了CPU執行權,但是那個鎖不能丟失,它後面執行的過程都需要帶著鎖,才能往下繼續執行。 二,測試程式碼 /**

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

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

spring的bean在執行注入的問題

問題描述 在spring中,如果需要在非同步執行緒中注入bean,會發現bean是空的情況。原因據說是spring bean 出於執行緒安全考慮,不得注入bean至執行緒類(Runnable)。 程式碼如下: public class DealThreadTask implem

axel: 執行下載工具,下載檔案可以替代curl、wget

 Axel 是 Linux 下一個不錯的HTTP/FTP高速下載工具。支援多執行緒下載、斷點續傳,且可以從多個地址或者從一個地址的多個連線來下載同一個檔案。適合網速不給力時多執行緒下載提高下載速度。比如在國內VPS或伺服器上下載lnmp一鍵安裝包用Axel就比wget快。opti

[Xcode10 實際操作]八、網路與執行-(18)PerformSelector訊息處理方法:由執行系統,負責去呼叫物件的指定方法

本文將演示PerformSelector訊息處理方法。在專案資料夾上點選滑鼠右鍵彈出檔案選單。【New File】->【Swift File】->【Next】->【Save As】:iOSApp.swift->【Create】現在開始編寫程式碼,建立Swift類【iOSApp.swif