弹簧@Autowired在新螺纹上不起作用

2022-09-03 00:28:29

当我运行 TaskJob 时,我收到空指针异常,因为 Spring 没有自动布线服务Job服务。新线程导致此问题是因为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 {
...
}

我的应用程序上下文.xml;

<context:component-scan base-package="cm.*" /> 

我的课程是;

cm.tasks.jobs.TaskJob
cm.jobs.ServiceJob
cm.services.MysqlService;

编辑:TaskJob instanciated with;

TaskJob taskJob = new TaskJob(name, source);
Thread taskThread = new Thread(taskJob);
taskThread.start();

答案 1

弹簧仅自动连接其创建的组件。您正在调用新的 TaskJob(),Spring 不知道此对象,因此不会发生自动布线。

作为一种解决方法,您可以直接调用应用程序上下文。首先,处理应用程序上下文。这可以通过为应用程序上下文本身添加@Autowire来完成。

@Autowired
private ApplicationContext applicationContext;

创建 TaskJob 时,请要求应用上下文执行自动连接。

TaskJob taskJob = new TaskJob(name, source);
applicationContext.getAutowireCapableBeanFactory().autowireBean(taskJob);

此外,如果您有任何需要触发的带注释的方法,则可以调用 initializeBean()@PostConstruct

applicationContext.getAutowireCapableBeanFactory().initializeBean(taskJob, null);

答案 2

您的 TaskJob 是实例化的 wihh “new” 运算符,这意味着创建的对象不是弹簧豆。因此,您必须编写代码来使用new运算符为属性(ServiceJob)创建对象。

在使用Spring spring框架时,服务对象不是这样创建的。请使用 Applicationcontext 的 getBean 方法。请看这里


推荐