今天写代码的时候发现@Autowired注入的时候一直注入不进来查询后这里记录一下
网上主要说的有几种原因
-
被注入对象所在对象在代码里面被new了,new出来的对象不能调用@Autowired,这里我个人认为可能是执行顺序的原因,因为如果是交由spring管理的bean会执行构造方法之后@PostConstructor之后就是@Autowired但是new了之后对象可能就不执行@Autowired了
-
被注入对象使用了多线程
出现原因代码
// 多线程方式
@org.junit.Test
public void show(){
Thread thread = new Thread(new Runnable() {
@Autowired
private TeacherDao teacherDao ;
@Override
public void run() {
// 报空指针
TeacherDao byId = teacherDao .getById("123");
System.out.println(byId.getObjectId());
}
});
thread.start();
System.out.println("哈哈哈");
}
// new对象方式
@Component
public class Test {
@Autowired
private TeacherDao teacherDao;
public void show(){
TeacherPo byId =
teacherDao.getById("123");
System.out.println(byId.getObjectId());
}
}
@org.junit.Test
public void show(){
Test t123 = new Test();
// 这里会报空指针,因为Test里面的teacherDao注入失败
t123.show();
System.out.println("哈哈哈");
}
解决办法:
@Component
public TestClass implement ApplicationContextAware{
/*注意:这里一定要是静态的,因为如果你new出来的TestClass使用静态变量
类初始化的时候就已经把该变量定义了后面直接通过ApplicationContextAware
注入进来的容器赋值即可*/
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
JD_ZJBQ_data.applicationContext = applicationContext;
}
public void show(){
TeacherDao teacherDao = applicationContext.getBean(TeacherDao.class);
// 该teacherDao是有值的
}
}