如何理解java中的依赖注入 通过构造函数和反射机制来实现的

要了解Java中的依赖注入,要了解java中的两个概念。这里是通过setXXX来实现依赖注入的。首先要了解java中基类与子类之间的构造函数的关系,再着就是了解java中反映的机制。

 

看一个基类BaseDao:

public classBaseDao {  

  publicBaseDao() {

      System.out.println(this);

      String clzName=this.getClass().getName();

      Method[] ms=this.getClass().getMethods();

      try {

      for(Method m:ms){

            String strName=m.getName();

            System.out.println(clzName+"."+strName);

//          if(strName.startsWith("set")){

//             UserDao ud=new UserDao();

//             m.invoke(this, ud);

//          }

         }

   }catch(IllegalArgumentException e) {

      e.printStackTrace();

   }

   }

public voidadd(Object obj){

      System.out.println("add");

  }

}

再一个是继承于基类的AddressDao.

public classAddressDao extendsBaseDao {

 

   UserDaoud;

  

   public AddressDao() {

      System.out.println("Address Dao no para constructor");

      //super(); super只能在第一句。

   }

 

   public UserDao getUserDao() {

      return ud;

   }

 

   public void setUserDao(UserDao ud){

      this.ud = ud;

   }

}

AddressDao中属性ud的定义。

 

public classUserDao  implements IUserDao{

 

   @Override

   public void add() {

      System.out.println("User Dao Add");

   }

   public void delete(){

   }

}

 

由于AddressDao继承于BaseDao,那在创建AddressDao时,无论执行AddressDao的那一个构造函数,都会去调用基类BaseDao的构造函数。这一点大家都知道,但子类的构造函数无论是显示的通过super(),还是隐式的调用基类的构造函数,都会向基类传递this指针。即潜在的调用是this.super();这样基类的this指针就会指向这个子类对象,而不在是基类对象。

如下面的例子

:        AddressDaoad=new AddressDao();

在创建空上ad对象时,根据上面的程序会得到下面的结果:

shu.cs.swartz.dao.AddressDao@e8eeca 

//System.out.println(this); 注意这时this变成了子类对象的指针,这就是子类的调用基类的构造函数时,会将对应的子类对象指针也传过来,基类的this指针就变成了子类对象指针了。

shu.cs.swartz.dao.AddressDao.setUserDao

shu.cs.swartz.dao.AddressDao.getUserDao

shu.cs.swartz.dao.AddressDao.add

shu.cs.swartz.dao.AddressDao.add

shu.cs.swartz.dao.AddressDao.getClass

shu.cs.swartz.dao.AddressDao.hashCode

shu.cs.swartz.dao.AddressDao.equals

shu.cs.swartz.dao.AddressDao.toString

shu.cs.swartz.dao.AddressDao.notify

shu.cs.swartz.dao.AddressDao.notifyAll

shu.cs.swartz.dao.AddressDao.wait

shu.cs.swartz.dao.AddressDao.wait

shu.cs.swartz.dao.AddressDao.wait

看到子类的对象和子类对象的setXX函数,就可以通过反映机制来在父类的构造函数中用传过来的对象和函数名调用子类的setXX,来实现注入了。

 

 

 

 

而 BaseDao bd=new BaseDao();

得到的程序结果是:

shu.cs.swartz.dao.BaseDao@169c6f2

//System.out.println(this); 这时没有子类没用,this就是该基类对象的本身了。

shu.cs.swartz.dao.BaseDao.add

shu.cs.swartz.dao.BaseDao.getClass

shu.cs.swartz.dao.BaseDao.hashCode

shu.cs.swartz.dao.BaseDao.equals

shu.cs.swartz.dao.BaseDao.toString

shu.cs.swartz.dao.BaseDao.notify

shu.cs.swartz.dao.BaseDao.notifyAll

shu.cs.swartz.dao.BaseDao.wait

shu.cs.swartz.dao.BaseDao.wait

shu.cs.swartz.dao.BaseDao.wait

其本身没有setXXX函数,就不会完成注入了。

 

所以理解依赖注入,最重要的理解,基类和子类构造函数的执行机制,然后再利用反射机制就可以啦!!!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值