小编典典

Spring @Autowired在新线程上不起作用

java

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

阅读 411

收藏
2020-12-03

共1个答案

小编典典

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);
2020-12-03