多线程注入bean遇到的问题
ときさきくるみ,大好き~
前言:
今天开发过程中遇到个诡异的问题,在多线程推数据的时候,发现调用的dao层注入为null,之前一直是通过applicationContext.getBean上下文来获取bean,为什么偏偏这次有问题,然后我就稍微研究了一下。
首先看看我们多线程常用的方法:
public class xxxApplication {
public static ApplicationContext applicationContext;
public static void main(String[] args) {
applicationContext = SpringApplication.run(xxxApplication.class, args);
}
}
然后在线程对象处调用:
public class xxx implements Runnable {
//获取bean
private xxxDao xxxDao = (xxxDao) xxxApplication.applicationContext.getBean("xxxDao");
@Override
public void run() {
...
xxxDao.test();
...
}
}
这在由@service、@component标注的bean当中是无效的,原因我猜测应该是注入bean在执行main初始化applicationContext之前。
其他方法:
- 可以在@service这类bean当中使用内部类创建线程,这样可以直接调用
@Service
class TestExample{
@Resource
TestDao testDao;
public void serviceExecute(){
ThreadExample te = new ThreadExample();
te.start();
}
private class ThreadExample extends Thread{
@Override
public void run(){
//使用bean
testDao.method();
}
}
}
- 或者实现ApplicationContextAware
其实也是获取上下文,也不能在bean当中
public class xxx implements ApplicationContextAware, Runnable {
private ApplicationContext applicationContext;
private xxxDao xxxDao = (xxxDao)applicationContext.getBean("xxxDao");
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void run() {
...
xxxDao.test();
...
}
}
- 构造方法传入
这里就不写代码了,方法就是在外面获取到bean然后传入线程的构造方法,很简单。