@Autowired注解在抽象类中实效的原因分析

原文地址:https://www.cnblogs.com/jy107600/p/7490390.html

 

@Autowired注解在抽象类中实效的原因分析

    最近在工作中遇到这个问题,在抽象类中使用Autowired这个注解,注入mybatis的dao时,总是出现空指针异常,通过日志的打印,发现是这个dao注入失败为空。然后通过new出spring上下文对象,再去调用getBean()方法,获取到这个注入的dao,这样是可行的,但是总是觉得这不是最佳实践,一定有比这个更加优雅的方式能解决这个问题。

    我们来还原一下这个问题:

1.定义一个抽象类,声明为spring组件,在其中自动装配另一个bean:

1 @Component
2 public abstract class BaseService {
3      @Autowired
4      Dao dao;
5  }

 

2.然后在他的子类中使用这个自动装配的对象:

复制代码

1 @Component
2 public class myService extends BaseService{
3     public void print(){
4         //运行时为null
5         System.out.print(dao.toString());
6     }
7 }

复制代码

在我们实例化子类对象的时候,抽象父类不能实例化,因为spring注入的是实例对象,而不是类,所以spring不会将dao自动装配注入到一个实例中。但是我们通过在在抽象类中获取的上下文对象中却可以拿到dao,因为这个上下文对象

是我们自己手动new出来的,不是spring通过反射注入到对象中去的。因此这种方案是可行的。

 

下面介绍一种更优雅的解决方案:

 

1.同样是定义一个抽象类;

1 public 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.print(dao.toString());
    }
}

复制代码

这样写是不是要比我们直接去new applicationContext更加优雅呢?

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值