1. 程式人生 > >在多執行緒中注入spring物件

在多執行緒中注入spring物件

以前一般很少用多執行緒處理些問題,今天遇到一個問題,在kafka的消費端,我是啟的多執行緒去消費kafka的資料,其中在多執行緒的業務程式碼中注入了server層的物件,但是在實際執行的時候卻發現注入不了,然後檢查spring的xml 包掃描的配置,發現配置沒有問題,後面才發現在多執行緒的執行緒內部不能注入spring容器所管理的物件,細想一下: 應該是因為在web容器啟動的時候,spring並不能感知還未執行的執行緒中的物件注入.

然後換了一種思路,就是在開啟執行緒之前在main執行緒中先注入server層的物件,然後在執行執行緒的時候把該物件作為引數傳入到執行緒內部執行,前提是這個物件必須是無狀態的或者說是執行緒安全的.

當然也可以使用spring的上下文去getBean()來獲取spring容器中的物件。

主執行緒的虛擬碼如下:


@Service
public class MainClassEG {

@Autowired
private ServiceEG service;

    public void methodEG {
        //執行消費
        for (int i = 0; i < 3; i++) {

            //在這裡開啟執行緒的時候傳入spring注入的service
            //如果把@Autowired註解的private ServiceEG service;寫在XxxThread執行緒類裡面,spring是不能注入的
executor.execute(new XxxThread(service,i); } } }

XxxThread 執行緒的虛擬碼如下:

public class XxxThread implements Runnable {

    private ServiceEg service;
    private int threadFlag;

    public XxxThread(ServiceEg service, int threadFlag) {
        super();
        this.service = service;
        this
.threadFlag = threadFlag; } public ServiceEg getService() { return service; } public void setService(ServiceEg service) { this.service = service; } public int getThreadFlag() { return threadFlag; } public void setThreadFlag(int threadFlag) { this.threadFlag = threadFlag; } @Override public void run() { service.doSomething(xxxx); } }