Type1接口注入
我们常常借助接口来将调用者与实现者分离。如:
publicclassClassA{
privateInterfaceBclzB;
publicinit(){
Ojbectobj=
Class.forName(Config.BImplementation).newInstance();
clzB=(InterfaceB)obj;
}
……
}
上面的代码中,ClassA依赖于InterfaceB的实现,如何获得InterfaceB实现类的实例?传统的方法是在代码中创建InterfaceB实现类的实例,并将起赋予clzB。
而这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码,我们根据预先在配置文件中设定的实现类的类名,动态加载实现类,并通过InterfaceB强制转型后为ClassA所用。
这就是接口注入的一个最原始的雏形。
而对于一个Type1型IOC容器而言,加载接口实现并创建其实例的工作由容器完成,如J2EE开发中常用的Context.lookup(ServletContext.getXXX),都是Type1型IOC的表现形式。
ApacheAvalon是一个典型的Type1型IOC容器。
Type2构造子注入
构造子注入,即通过构造函数完成依赖关系的设定,如:
publicclassDIByConstructor{
privatefinalDataSourcedataSource;
privatefinalStringmessage;
publicDIByConstructor(DataSourceds,Stringmsg){
this.dataSource=ds;
this.message=msg;
}
……
}