繁体   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