作为一个新的事实上的工业标准,OSGi已经受到了广泛的关注,其面向服务(接口)的基本思想和动态模块部署的能力,是企业级应用长期以来一直追求的目标。Spring是一个著名的轻量级J2EE开发框架,其特点是面向接口编程和非侵入式的依赖注入。将OSGi和Spring结合能充分发挥二者各自的特长,更好地满足企业级应用开发的需求。Spring开发组织在2008年发布了将OSGi和Spring结合的第一个版本:Spring-DM。本文通过一个简单实例,介绍如何利用Spring-DM开发基于OSGi和Spring架构的Web应用,同时探讨其中用到的关键技术及其基本思想。
开发一个简单的OSGi Web应用实例
一个简单的Web应用
我们写一个简单的Web应用compute.html:计算两个数字的和或乘积。如下图所示:
图1. 一个简单例子
一个简单例子.bmp
为了体现OSGi bundle的动态部署能力,我们写两个service bundle,其中一个计算两个数字的和(称为add bundle),另外一个计算两个数字的积(称为multiply bundle)。当我们点击“Compute”按钮的时候,如果此时add bundle被部署,则页面将返回两个数字的和,否则如果此时multiply bundle被部署,则页面将返回两个数字的积。
开发环境准备
·下载Eclipse 3.4
·获取所有OSGi, Equinox和Spring的插件, 如下图所示:
图2. 相关插件列表
·打开Eclipse,设置target platform为上述插件集合
基本模块设计
该应用主要包含两个层次: 服务层和Web层。Web层基于Spring-MVC实现,包含处理Web访问相关的bundle(本例中只有一个)。服务层包含处理数字计算的bundle,本例中包含一个声明服务接口的compute interface bundle和两个实现该服务接口的bundle:add bundle和multiply bundle。基本模块结构如下图所示:
图3. 基本框架
模块程序实现
Step 1 :实现Service Layer
服务层的三个OSGi bundle实现完毕之后如下图所示:
图4. 服务层
服务层.bmp
其中com.zxn.example.service.compute是声明服务接口的bundle。com.zxn.example.service.compute.add和com.zxn.example.service.compute.multiply是实现了服务接口的两个bundle。
·com.zxn.example.service.compute
声明一个Compute接口,其中包含一个接口方法computeNums(),如下图所示:
图5. 服务层接口bundle
·com.zxn.example.service.compute.add
bundle com.zxn.example.service.compute.add的基本程序结构如下图所示:
图6. 接口实现bundle:add
在该add bundle中,添加一个Add类,实现Compute接口,如下图所示:
图7. 接口实现代码:Add类
注意到我们在META-INF下建了一个spring目录,并且添加了一个computeAdd-context.xml文件。系统启动时,Spring将利用该xml文件创建一个bean实例,并把该bean输出为一个OSGi service,如下图所示:
图8. Spring声明文件:computeAdd-context.xml
该xml文件中,osgi: service是Spring-DM输出OSGi service的标记,其中的interface属性标明了该service实现的服务接口。
·com.zxn.example.service.compute.multiply
按照与add bundle同样的方法,实现multiply bundle,如下图所示:
图9. 接口实现代码:Multiply类
接口实现代码-Multiply类.bmp
类似的,添加一个computeMultiply-context.xml输出OSGi service,如下图所示:
图10. Spring声明文件:computeMultiply-context.xml
Step 2:实现Web Layer
Web层只包含一个bundle:com.zxn.example.web,采用Spring-MVC和OSGi构建,基本程序结构如下图所示:
图11. Web Layer程序结构
·ComputeControler.java
该JAVA类实现了org.springframework.web.servlet.mvc.Controller,是本web应用中核心的servlet,负责接受并处理web请求。该类调用ComputeServiceRef的方法实现业务逻辑。该类关键的方法是handleRequest(…),如下图所示:
图12. 核心servlet类
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
当web成为选择 开发原生移动app还值得吗?
随着iPhone的推出,其进入的代价是通过苹果应用商店流通的编译过的Objective-C二进制代码的分发。
-
十大响应式Web设计框架
对于设计师而言,网站设计中的任意一环节都不容忽视。借助网上的一些资源,只需简单的几个步骤你就可创建出更具吸引力的设计,本文将分享十款最佳的响应式Web设计。
-
OSGi中该使用Blueprint还是声明式服务?
在OSGi中,服务是实现bundle间交互和应用灵活性的基石。借助于服务,我们能够降低bundle之间的耦合,更加有利于软件的重用。
-
管理员必知:监控系统五大必备特性汇总
纵观我们部署在基础设施当中并始终保持运作的全部测量机制,监控系统无疑是重要性最高的机制之一,但它却常常遭到我们的忽视。