当我运行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()
@PostConstruct
applicationContext.getAutowireCapableBeanFactory().initializeBean(taskJob, null);