要了解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函数,就不会完成注入了。
所以理解依赖注入,最重要的理解,基类和子类构造函数的执行机制,然后再利用反射机制就可以啦!!!