[英]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.