Spring @Autowired没有在新线程上工作

时间:2017-02-28 07:11:34

标签: java spring autowired

当我运行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();

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:2)

你的TaskJob被实例化了&#34; new&#34; operator,表示创建的对象不是spring bean。 因此,您必须使用new运算符编写代码来为属性(ServiceJob)创建对象。

使用Spring spring框架时,不会像这样创建Service对象。 请使用Applicationcontext的getBean方法。 请参阅here

答案 2 :(得分:-3)

请尝试此类型

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