对依赖注入技术的初学指导
2008-09-20 13:26:20 来源:WEB开发网值得注意的依赖关系如下:
AirlineAgency和CabAgency是代表相应服务的接口程序。CabAgency需要对AirlineAgency有一个引用才能完成它的功能。
TripPlanner是一个在与AirlineAgency和CabAgency结合起来后来完成旅行计划的接口程序。TripPlanner需要对AirlineAgency和CabAgency的引用。
基于源代码的UML图如下所示:
在各个不同框架下应注意到的显著的差别是:
harness类里的configure()和getPlanner()方法
接口和实施类的关系是如何描述的(有的使用Java,有的使用XML文件)
不同服务组件间的依赖关系是如何声明的(有的使用XML文件,有的使用constructor,有的使用setter的方法)
其他的需求期望(比如说,xwork里的接口推动者-enabler interfaces)
无容器实施
对于无容器实施而言,无一定之规。一些实施会做服务组件的查询(比如JNDI)或建立一组工厂的接口程序(可能通过单态模式来实施)。在我们这个case里,我选择的是首先从属性文件里读取类名,然后使用映射的方式来将各服务组件里的对象实例化。
属性文件如下(只有类名):
airline-agency-class = com.dnene.ditutorial.common.impl.SimpleAirlineAgency
cab-agency-class = com.dnene.ditutorial.common.impl.ConstructorBasedCabAgency
用来实例化AirlineAgency,CabAgency,和TripPlanner的源代码如下:
AirlineAgency airlineAgency = null;
CabAgency cabAgency = null;
TripPlanner tripPlanner = null;
// Get class names from property file
InputStream propertyFile = getClass().getClassLoader().
getResourceAsStream("nocontainer-agency.properties");
Properties properties = new Properties();
properties.load(propertyFile);
Class airlineAgencyClass = Class.forName
(properties.getProperty("airline-agency-class"));
Class cabAgencyClass = Class.forName
(properties.getProperty("cab-agency-class"));
Class tripPlannerClass = Class.forName
(properties.getProperty("trip-planner-class"));
if (AirlineAgency.class.isAssignableFrom(airlineAgencyClass))
{
// Instantiate airline agency
airlineAgency = (AirlineAgency) airlineAgencyClass.newInstance();
}
if (CabAgency.class.isAssignableFrom(cabAgencyClass))
{
// Instantiate CabAgency, and satisfy its dependency on an airlineagency.
Constructor constructor = cabAgencyClass.getConstructor
(new Class[]{AirlineAgency.class});
cabAgency = (CabAgency) constructor.newInstance
(new Object[]{airlineAgency});
}
if (TripPlanner.class.isAssignableFrom(tripPlannerClass))
{
Constructor constructor = tripPlannerClass.getConstructor
(new Class[]{AirlineAgency.class,CabAgency.class});
tripPlanner = (TripPlanner) constructor.newInstance
(new Object[]{airlineAgency,cabAgency});
}
return tripPlanner;
更多精彩
赞助商链接