Spring 在多線程中,bean的注入問題


Spring 在多線程中,bean的注入問題

最近碰到了一個問題,使用SSM框架,在Service層需要另開一個線程,這個線程專門用來做一些操作,並將結果寫入數據庫中。但是在線程中使用@Resource或者@Autowired注入全部為NULL,
原來是Spring不能在線程中注入。

網上的主要解決方法有:

將需要的Bean作為線程的的構造函數的參數傳入
使用ApplicationContext.getBean方法來靜態的獲取Bean

我的線程中所需要的Bean的數量較多,並且以后還有可能增加或者減少,所以方法1並不適合
我的Spring配置文件並不只一個,而且使用getBean方法需要重新加載一遍所有的Bean,這樣也違反的Spring的IoC,並不是我想要的,所以也不采用方法2

最后確定使用內部類的方法,將線程中需要的Bean提前注入好,大致的結構如下:

@Service
class TestExample{

//這兩個為線程所需要的Bean
@Resource
TestDao testDao;

@Resource
NeedDap needDao;

public void serviceExecute(){
    //在這里開啟線程,執行操作
    ThreadExample te = new ThreadExample();
    te.start();
}

//內部類
private class ThreadExample extends Thread{

    public ThreadExample(){
        //也可以在構造函數中傳入參數
    }
    public void run(){
        //這里為線程的操作
        //就可以使用注入之后Bean了

    }
}

}

方法二

spring在啟動時會在主程序中注入bean,但是線程類是不會注入的,只能通過getbean獲取

private static WxUserService wxUserService;

private static ApplicationContext ctx = null;

static{
ctx = ContextLoaderListener.getCurrentWebApplicationContext();
wxUserService = (WxUserService) ctx.getBean("wxUserService");

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM