当我运行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();
答案 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" />