模块化Java:动态模块化 - 编程入门网
注意他们与WS-DeathStar或其他任何XML底层架构都没有关系 ;他们就是普通Java对象——Plain Old Java Objects)。
典型工厂实现方式是使用从properties文件中获取的某种形式的类名,然后 用Class.forName()来实例化相应的类,OSGi则不同,它 维护了一个‘服务注册 器’,其实这是一个包含了类名和服务的映射列表。这样,OSGi系统就可以使用 context.getService(getServiceReference("java.sql.Driver")),而不是 class.forName("com.example.JDBCDriver")来获取一个JDBC驱动器。这就把 client代码解放出来了,它不需知道任何特定客户端实现;相反,它可以在运行 时绑定任何可用驱动程序。移植到不同的数据库服务器也就非常简单了,只需停 止一个模块并启动一个新模块;client甚至不需要重新启动,也不需要改变任何 配置。 这样做是因为client只需知道其所需的服务的API(基本上都是接口,尽管 OSGi规范允许使用其他类)。在上述情况中,接口名是 java.sql.Driver;返回 的接口实例是具体的数据库实现(不必了解是哪些类,编码在那里)。此外,如 果服务不可用(数据库不存在,或数据库临时停掉了),那么这个方法会返回 null以说明该服务不可用。 为了完全动态,返回结果不应被缓存。换句话说,每当需要服务的时候,需 要重新调用getService。框架会在底层执行缓存操作,因此不存在太大的性能 问题。但重要的是,它允许数据库服务在线被替换成新的服务,如果没有缓存代 码,那么下次调用时,client将透明地绑定到新服务上。 模块化Java:动态模块化(2)时间:2010-11-29 infoq 译:宋玮付诸实施 为了证明这一点,我们将创建一个用于缩写URL的OSGi服务。其思路是服务接 收一个长URL,如http://www.infoq.com/articles/modular-java-what-is-it, 将其转换为短点的URL,如http://tr.im/EyH1。该服务也可以被广泛应用在 Twitter这样的站点上,还可以用它来把长URL转成短的这样便签背后也写得下。 甚至像《新科学家》和《Macworld》这样的杂志也是用这些短URL来印刷媒体链 接的。 为了实现该服务,我们需要: 一个缩写服务的接口 一个注册为缩写实现的bundle 一个验证用client 尽管并没有禁止把这些东西都放在同一个bundle中,但是我们还是把他们分 别放在不同的bundle里。(即便他们在一个bundle中,最好也让bundle通过服务 来通讯,就好像他们处于不同的bundle一样;这样他们就可以方便地与其他服务 提供者进行集成。 把缩写服务接口与其实现(或client)分开放在单独bundle中是很重要的。 该接口代表了client和server之间的‘共享代码’,这样,该接口在每个bundle 中都会加载。正因如此,每个bundle实际上都被固定到了该接口特定版本上,所 有服务都有共同的生命周期,将接口放在单独 bundle中(在整个OSGi VM生命周 期中都在运行),我们的client就可以自由变化。如果我们把该接口放在某个服 务实现的bundle中,那么该服务发生变化后我们就不能重新连接到client上了。 shorten接口的manifest和实现如下:
上面的例子建立了一个拥有单一接口(com.infoq.shorten.IShorten)的 bundle(com.infoq.shorten),并将其输出给client。参数是一个URL,返回一 个唯一的压缩版URL。 和接口定义相比,实现就相对有趣一些了。尽管最近缩写名称的应用开始多 起来了,但是所有 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |