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");
}