快速业务通道

基于Eclipse RCP简化IoC实现 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
JavaBeans属性)。这是一种由PicoContainer专用的独特的方法。另外,它也用于HiveMind和Spring中。

我们将采纳类型2的一种变体-通过注解的方法提供服务。一种声明一个依赖性的方法可以如下实现:

@Injected public void aServicingMethod(   Service s1,AnotherService s2) {    //把s1和s2保存到类变量中    //以便在需要时使用它们 }

控制反转容器将查找注入的注解并且调用要求的参数来调用该方法。为了把IoC加入到Eclipse平台中,我们把在服务和可服务的对象之间进行绑定的代码打包为一个Eclipse插件。该插件定义一个扩展点(名为com.onjava.servicelocator.servicefactory)-它可以用来为应用程序提供服务工厂。无论何时当一个可服务的对象需要配置时,该插件将请求到一个工厂的服务实例。ServiceLocator类负责实现所有这些工作,正如下面的代码片断所描述的(我们跳过处理分析扩展点的代码-因为这些代码非常直接):

/** *把要求的依赖性注入到参数对象中。它扫描可服务的对象-通过查找标识有{@link Injected}注解的方法。参数类型是从匹配的方法中提取的。每一种类型的实例是从注册的工厂中创建的(见{@link IServiceFactory})。相应于所有参数类型的实例都被创建完毕,该方法被调用,并继续检查下一个方法。 * * @param-要被服务的可服务对象 * @抛出ServiceException异常 */ public static void service(Object serviceable) throws ServiceException {   ServiceLocator sl = getInstance();   if (sl.isAlreadyServiced(serviceable)) {    //避免多次初始化问题-由于存在构造器分层    System.out.println("Object " +serviceable + " has already been configured ");    return;   }   System.out.println("Configuring " + serviceable);   //为请求的服务分析类   for (Method m : serviceable.getClass().getMethods()) {    boolean skip=false;    Injected ann=m.getAnnotation(Injected.class);    if (ann != null) {     Object[] services = new Object[m.getParameterTypes().length];     int i = 0;     for(Class<?> klass :m.getParameterTypes()){      IServiceFactory factory = sl.getFactory(klass,ann.optional());      if (factory == null) {       skip = true;       break;       }      Object service = factory.getServiceInstance();      //检查:确保返回的服务的类是从该方法中盼望的那一个      assert(service.getClass().equals(klass) || klass.isAssignableFrom(service.getClass()));      services[i++] = service ;     }     try {      if (!skip)       m.invoke(serviceable, services);     }     catch(IllegalAccessException iae) {      if (!ann.optional())       throw new ServiceException("Unable to initialize services on " +         serviceable +         ": " + iae.getMessage(),iae);     }     catch(InvocationTargetException ite) {      if (!ann.optional())       throw new ServiceException("Unable to initialize services on " +         serviceable + ": " + ite.getMessage(),ite);     }    }   }   sl.setAsServiced(serviceable); }

既然由该服务工厂返回的服务也可能是可服务的;所以,这种策略允许定义服务层次(即嵌套的服务)(但是,目的还不支持循环依赖性)。

基于Eclipse RCP简化IoC实现

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号