簡體   English   中英

Spring @Autowired沒有在新線程上工作

[英]Spring @Autowired not working on new thread

當我運行TaskJob時,我得到空指針異常,因為Spring沒有自動裝配serviceJob服務。 新線程是否導致此問題,因為Spring自動連接mysqlService沒有任何問題?

public class TaskJob implements Runnable {
    @Autowired
    private ServiceJob serviceJob;

    String name;
    String source;

    public TaskJob(String name, String source) {
        this.name = name;
        this.source = source;
    }

    public void run() {
        serviceJob.run();
    }
}

@Service
public class ServiceJob extends BaseJob{

    @Autowired
    private MysqlService mysqlService;

    public void run(){
    ....
    }
}

@Service
public class MysqlService {
...
}

我的applicationContext.xml;

<context:component-scan base-package="cm.*" /> 

我的課程是;

cm.tasks.jobs.TaskJob
cm.jobs.ServiceJob
cm.services.MysqlService;

編輯: TaskJob實例化;

TaskJob taskJob = new TaskJob(name, source);
Thread taskThread = new Thread(taskJob);
taskThread.start();

Spring只會自動裝配它創建的組件。 你正在調用新的TaskJob(),Spring不知道這個對象所以不會發生自動裝配。

作為一種解決方法,您可以直接調用應用程序上下文。 首先了解應用程序上下文。 這可以通過為應用程序上下文本身添加@Autowire來完成。

@Autowired
private ApplicationContext applicationContext;

創建TaskJob時,請詢問應用程序上下文以進行自動連接。

TaskJob taskJob = new TaskJob(name, source);
applicationContext.getAutowireCapableBeanFactory().autowireBean(taskJob);

另外,如果你有任何@PostConstruct注釋方法需要觸發,你可以調用initializeBean()

applicationContext.getAutowireCapableBeanFactory().initializeBean(taskJob, null);

你的TaskJob是用“new”操作符實例化的,這意味着創建的對象不是spring bean。 因此,您必須編寫代碼以使用new運算符為屬性(ServiceJob)創建對象。

使用Spring spring框架時,不會像這樣創建Service對象。 請使用Applicationcontext的getBean方法。 請看這里

請嘗試這種類型

<context:component-scan base-package="cm.*,cm.tasks.jobs" /> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM