简体   繁体   中英

Spring @Autowired not working on new thread

When I run TaskJob I am getting null pointer exception because Spring doesn't autowiring serviceJob service. Is new thread causing this problem because Spring autowired mysqlService without any problem?

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 {
...
}

My applicationContext.xml;

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

And my classes are;

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

EDIT: TaskJob instanciated with;

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

Spring only autowires components it creates. You are calling new TaskJob(), Spring doesn't know about this object so no autowiring will take place.

As a workaround you can call the application context directly. Firstly get a handle on the application context. This can be done by adding @Autowire for the application context itself.

@Autowired
private ApplicationContext applicationContext;

When you create TaskJob, ask the app context to do your auto-wiring.

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

Additionally if you have any @PostConstruct annotated methods you need triggering you can call initializeBean()

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

Your TaskJob is instantiated wihh "new" operator which means the object created is not a spring bean. So you will have to write code to create object for the property (ServiceJob) with the new operator.

While using Spring spring framework Service objects are not created like this. Kindly use getBean method of Applicationcontext. Please see here

请尝试这种类型

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM