对依赖注入技术的初学指导
2008-09-20 13:26:20 来源:WEB开发网依赖性的声明
依赖性是将包含着某一特定服务组件所依赖的接口程序列表的一个constructor里声明的。在下面的情况里,
ConstructorBasedCabAgency的服务件是依赖于AirlineAgency的接口程序的。
public ConstructorBasedCabAgency(AirlineAgency airlineAgency)
{
this.airlineAgency = airlineAgency;
}
类似地,ConstructorBasedTripPlanner也在它的constructor里声明对AirlineAgency和CabAgency的依赖。
依赖性的解决方案
Pico通过查看constructors来解决依赖性的问题。服务组件借助于对具体实施类的注册而完成在Pico容器中的注册。用户组件
通过那些接口类的名字来调用服务组件。智能化的Pico容器将遍历接口实施的层次和等级来返回适合用户需求的实施。(请注意在前面讨论过的
无容器实施方案也是通过类名来实例化实施类的)。
因为TripPlanner接口是依赖于Airline和CabAgency两个接口的,CabAgency接口又是依赖于AirlineAgency接口的,Pico容器
会自动将AirlineAgency首先实例化,然后在建CabAgency时,将对AirlineAgency的引用传递过去;在建TripPlanner时,
将对AirlineAgency和CabAgency的引用传递过去。在下面的需求提出时,上面整个的次序得以执行:
pico.getComponentInstanceOfType(TripPlanner.class);
HiveMind的实施
XML的声明
在这个例子里,接口和实施类都在xml文件里来声明。请注意各服务端组件间的依赖性不在xml文件里声明,而是在随后的代码里。
xml文件里的一个服务点将记录下一个服务组件所需的必要数据。
<?xml version="1.0"?>
<module id="com.dnene.ditutorial.hivemind" version="1.0.0">
<service-point id="AirlineAgency" interface="com.dnene.ditutorial.common.AirlineAgency">
<create-instance class="com.dnene.ditutorial.common.impl.SimpleAirlineAgency"/>
</service-point>
<service-point id="CabAgency" interface="com.dnene.ditutorial.common.CabAgency">
<invoke-factory>
<construct class="com.dnene.ditutorial.common.impl.SetterBasedCabAgency"/>
</invoke-factory>
</service-point>
<service-point id="TripPlanner" interface="com.dnene.ditutorial.common.TripPlanner">
<invoke-factory>
<construct class="com.dnene.ditutorial.common.impl.SetterBasedTripPlanner"/>
</invoke-factory>
</service-point>
</module>
更多精彩
赞助商链接