简介: 作为一个新的事实上的工业标准,OSGi 已经受到了广泛的关注, 其面向服务(接口)的基本思想和动态模块部署的能力, 是企业级应用长期以来一直追求的目标。Spring 是一个著名的 轻量级 J2EE 开发框架,其特点是面向接口编程和非侵入式的依赖注入。将 OSGi 和 Spring 结合能充分发挥二者各自的特长,更好地满足企业级应用开发的需求。Spring 开发组织在 2008 年发布了将 OSGi 和 Spring 结合的第一个版本:Spring-DM。本文通过一个简单实例,介绍如何利用

Spring-DM 开发基于 OSGi 和 Spring 架构的 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 类

ComputeServiceRef.java

该 JAVA 类负责引用部署的 service bundle 完成最终计算,其中的 computeService 由 Spring 根据 OSGi 中实际部署的 service 进行注入。本例中,实际部署的 service 可能是 add bundle 或者 multiply bundle。

需要特别注意的是,此处体现了 Spring-DM 的动态特性。OSGi 的动态部署能力使得 Spring 的动态服务注入成为可能。

图 13. 服务消费类

HTTPContextResgistry.java

该 JAVA 类负责在 OSGi 环境中配置和注册 HTTP 服务,其关键方法为 bean 初始化时调用的 init( ) 方法。

图 14. 在 OSGi 环境中注册 HTTP 服务

该 init 方法中,第六行的 getHTTPService(…) 调用 OSGi 的 ServiceTracker 来获取 OSGi环境中注册的 HTTP 服务的引用,如下图所示:

图 15. 使用 ServiceTracker 获取 HTTP 服务

computeWeb-context.xml

该 xml 文件主要用于配置 HTTPContextResgistry bean 类,以及导入对 Compute 服务接口的引用。标记 osgi : reference用于声明要导入的服务接口,其 interface 属性标明了该接口的定义,本例中为 com.zxn.example.service.compute.Compute 接口。

图 16. Spring 声明文件:导入服务接口

computeWeb-Dispatcher.xml

该 xml 文件用于配置 ComputeControler bean类。

图 17. Spring 声明文件:配置核心 servlet 类

以往开发 J2EE 应用通常需要将应用服务器的 runtime 集成到开发环境中才能进行程序调试,非常麻烦。基于 OSGi 的应用完全可以脱离应用服务器运行,这使得程序开发和调试变得非常容易,直接在 Eclipse 中调试运行就可以。我们在 Eclipse 中将程序运行起来,如下图所示:

图18. 运行 OSGi 程序

从上图中看到,我们同时选择部署了 add bundle 和 multiply bundle,利用 OSGi console 察看如下:

图 19. 察看部署的 OSGi bundle

当 OSGi 环境中同时部署有多个服务接口的实现 bundle 时,OSGi 会选择一个默认的 bundle提供服务。本例中,Spring 会默认注入 add bundle。我们通过 web 访问 compute.html 页面:

图 20. 访问页面

点 Compute 按钮之后,结果页面如下:

图 21. 访问结果

可以看出,是 add bundle 提供了计算服务。下面我们通过命令 <stop 76> 来停止 add bundle的服务:

图 22. 停止 add bundle

图 23. add bundle 状态变为 RESOLVED

重新访问 compute.html 页面,结果得到的是两个数字的乘积。可以看出,是 multiply bundl

提供了计算服务。如下图所示:

图 24. 再次访问页面

作为当前颇具生命力的两个标准和框架,OSGi 和 Spring 已经初步融合在一起。二者的结合,为开发企业级的 Web 应用同时提供了巨大的灵活性和动态部署能力。本文通过一个简单的例子,描述如何开发一个基于 OSGi 和 Spring 的 Web 应用,并说明了开发过程中涉及到的技术关键点。

osgi java web_基于 OSGi 和 Spring 开发 Web 应用相关推荐

  1. osgi java web_基于OSGi和Spring开发企业级Web应用

    Spring 作为一个新的事实上的工业标准,OSGi已经受到了广泛的关注,就在不久前EclipseCon也发布企业级OSGi标准,而IBM以及Eclipse也宣称将大力发展Java模块化.Spring ...

  2. spring基于注释的配置_基于注释的Spring MVC Web应用程序入门

    spring基于注释的配置 这是使Maven启动Spring 3 MVC项目的最小方法. 首先创建spring-web-annotation/pom.xml文件,并包含Spring依赖项: <? ...

  3. 基于注释的Spring MVC Web应用程序入门

    这是使Maven启动Spring 3 MVC项目的最小方法. 首先创建spring-web-annotation/pom.xml文件,并包含Spring依赖项: <?xml version=&q ...

  4. java osgi web开发_基于 OSGi 和 Spring 开发 Web 应用

    开发一个简单的OSGi Web应用实例 一个简单的Web应用 我们写一个简单的 Web 应用 compute.html :计算两个数字的和或乘积.如下图所示: 图1.一个简单例子 一个简单例子.bmp ...

  5. osgi框架 android,基于OSGi的Android应用模块动态加载框架设计与实现

    摘要: 伴随着移动互联网科技水平向4G的飞跃,移动终端的使用日趋常态化,移动智能设备的普及率越来越高,得到了大量使用者的追捧.与此同时,各手机操作系统下应用商店里正充斥着琳琅满目的移动应用产品,用户对 ...

  6. Java笔记二十四——Spring开发

    Spring是一个支持快速开发Java EE应用程序的框架.它提供了一系列底层容器和基础设施,并可以和大量常用的开源框架无缝集成,可以说是开发Java EE应用程序的必备. 在Spring Frame ...

  7. Java Server Faces_用JavaServer Faces开发Web应用(4) (转)

    用JavaServer Faces开发Web应用(4) (转)[@more@] 6.事件处理. XML:namespace prefix = o ns = "urn:schemas-micr ...

  8. 请假代码java web_基于jsp的学生请假管理系统-JavaEE实现学生请假管理系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的学生请假管理系统, 该项目可用各类java课程设计大作业中, 学生请假管理系统的系统架构分为前后台两部分, 最终实 ...

  9. java around_基于Annotation的Spring AOP: @Around | 学步园

    @Around 增强处理是功能比较强大的增强处理,它近似等于Before 和AfterReturning的总和.@Around既可在执行目标方法之前织入增强动作,也可在执行目标方法之后织入增强动作.@ ...

  10. 基于ARCGIS二次开发可视化开发环境搭建(JAVA)

    这两天为了搭建这么一个基于java的ArcGIS二次开发环境可着实花了一番心血.在网上搜索各种资料,大部分都是基于C#的,关于JAVA的很少,而且很杂乱,没有一个完整的.详细的.适合新手的这么一个教程 ...

最新文章

  1. 在Debian中建立Beaglebone black的应用开发环境之四:如何布置应用?
  2. python——类和对象之私有属性
  3. 我是如何进入全球顶级AI实验室的 (1)
  4. mapstruct详解
  5. 使用Google Guice消除实例之间的歧义
  6. 极简好看的个人介绍页源码
  7. linux非编工作站,高清EDIUS非编网络系统建设 在线非编系统
  8. 小程序--按钮返回上页
  9. ctf xor题_CTF下的命令执行
  10. zblog php获取文章的第一张图片,zblog 获取文章图片作缩略图的几种方式
  11. 【数据库】Hive SQL 正则表达式进阶二(regexp_extract函数进阶使用)
  12. zabbix下载方式
  13. 0x0000000000000000 in ??
  14. 点击a标签弹出iframe_iframe标签与a标签
  15. 萃见:上班还是创业,这是一个值得思考的问题?
  16. dubbo优点是什么dubbo有哪些缺点
  17. 阿里云无影云电脑ubantu中文失败解决方案
  18. 运行moveit报错
  19. 人民路婚纱店入驻华盛街
  20. 决策树总结(个人学习体会)

热门文章

  1. Servlet做Controller,实现一个类处理多个请求
  2. VS2008开发中Windows Mobile 5.0 emulator连网的配置
  3. C# 在采集数据时的验证与登录处理
  4. Java描述设计模式(01):单例模式
  5. 数据时代,嵌入式工程师必须知道的八大加密算法
  6. elasticsearch.net search入门使用指南中文版(翻译)
  7. Android API介绍
  8. 浅谈数据结构-二叉树
  9. Javascript中的执行环境及作用域
  10. 面试问题——fread和read的区别