zoukankan      html  css  js  c++  java
  • @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更加优雅呢?

  • 相关阅读:
    测试驱动开发的意义何在
    Web自动化测试模式page object的小利器:gizmo
    在NANT使用Nunit2标签运行Nunit测试
    小试牛刀 Ruby on Rails
    敏捷回顾会议的思考
    ThoughtWorks技术校园行第二波 课程资料 CleanCode&DirtyCode
    从git merge 和 git rebase想到……
    Ruby中的深浅拷贝
    NUnit Extension小介绍
    如何写好的测试呢?
  • 原文地址:https://www.cnblogs.com/jy107600/p/7490390.html
Copyright © 2011-2022 走看看