@Autowired注解在抽象类中实效的原因分析
最近在⼯作中遇到这个问题,在抽象类中使⽤Autowired这个注解,注⼊mybatis的dao时,总是出现空指针异常,通过⽇志的打印,发现是这个dao注⼊失败为空。然后通过new出spring上下⽂对象,再去调⽤getBean()⽅法,获取到这个注⼊的dao,这样是可⾏的,但是总是觉得这不是最佳实践,⼀定有⽐这个更加优雅的⽅式能解决这个问题。
我们来还原⼀下这个问题:
1.定义⼀个抽象类,声明为spring组件,在其中⾃动装配另⼀个bean:
1 @Component
2public abstract class BaseService {
3 @Autowired
4 Dao dao;
5 }
2.然后在他的⼦类中使⽤这个⾃动装配的对象:
1 @Component
2public class myService extends BaseService{
3public void print(){
4//运⾏时为null
5 System.out.String());
6 }
实例化bean的三种方式7 }
在我们实例化⼦类对象的时候,抽象⽗类不能实例化,因为spring注⼊的是实例对象,⽽不是类,所以spring不会将dao⾃动装配注⼊到⼀个实例中。但是我们通过在在抽象类中获取的上下⽂对象中却可以拿到dao,因为这个上下⽂对象
是我们⾃⼰⼿动new出来的,不是spring通过反射注⼊到对象中去的。因此这种⽅案是可⾏的。
下⾯介绍⼀种更优雅的解决⽅案:
1.同样是定义⼀个抽象类;
1public class BaseService {
2 Dao dao;
3 }
2.在⼦类中使⽤注解:
@Component
public class myService extends BaseService{
//Autowired修饰⽅法时,根据⽅法参数类型判断实例化哪个类
@Autowired
public void printDao(Dao dao){
super.dao = dao;//⽗类属性注⼊
}
public void print(){
System.out.String());
}
}
这样写是不是要⽐我们直接去new applicationContext更加优雅呢?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论