OSGI与Spring结合开发web工程

简介: 作为一个新的事实上的工业标准,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 被部署,则页面将返回两个数字的积。

开发环境准备

  1. 下载 Eclipse 3.4
  2. 获取所有 OSGi, Equinox 和 Spring 的插件, 如下图所示:

图 2. 相关插件列表

  1. 打开 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。

  1. com.zxn.example.service.compute

声明一个 Compute 接口,其中包含一个接口方法 computeNums(),如下图所示 :

图 5. 服务层接口 bundle

  1. 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 实现的服务接口。

  1. 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 程序结构

  1. ComputeControler.java

该JAVA类实现了 org.springframework.web.servlet.mvc.Controller是本 web应用中核心的 servlet,负责接受并处理 web 请求。该类调用 ComputeServiceRef 的方法实现业务逻辑。该类关键的方法是 handleRequest(…), 如下图所示 :

图 12. 核心 servlet 类

  1. ComputeServiceRef.java

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

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

图 13. 服务消费类

  1. HTTPContextResgistry.java

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

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

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

图 15. 使用 ServiceTracker 获取 HTTP 服务

  1. computeWeb-context.xml

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

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

  1. 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 应用,并说明了开发过程中涉及到的技术关键点。

时间: 2024-10-20 02:59:28

OSGI与Spring结合开发web工程的相关文章

Spring Boot开发Web应用

静态资源访问 在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static /public /resources /META-INF/resources 举例:我们可以在src/main/resources/目录下创建static,在该位置放置一个图片文件.启动程序后,尝试访问http://localhost:8080/D.jpg.如能显示图片,配置成功. 渲染

Spring Boot开发Web应用之Thymeleaf篇

前言 Web开发是我们平时开发中至关重要的,这里就来介绍一下Spring Boot对Web开发的支持. 正文 Spring Boot提供了spring-boot-starter-web为Web开发予以支持,spring-boot-starter-web为我们提供了嵌入的Tomcat以及Spring MVC的依赖. 项目结构推荐 一个好的项目结构会让你开发少一些问题,特别是Spring Boot中启动类要放在root package下面,我的web工程项目结构如下: root package结构:

MyEclipse + Maven开发Web工程的详细配置过程

http://b-l-east.iteye.com/blog/1246482 1.workspace下 mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp D:\study\workspace4>mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp [INFO] Scanning for projects... .... [INFO

如何设置eclipse开发的web工程自动发布到tomcat的webapps下?

使用eclipse开发web工程,在配置好服务器(tomcat)之后运行该web工程,发现能正常运行.但是问题在于,当你打开tomcat路径\webapps时,会发现没有该web应用(你的web工程名命名的文件夹),而且你也不清楚该web发布到哪去了.......那么这个问题该怎么解决呢? 一.在您打开的Eclipse工作台的其他视图中选中"服务器"视图,在该视图中双击您所用的服务器: 二.在编辑窗口中会,自动打开一个关于该服务器设置的overview页面,按下图中设置,图中的内容是我

使用Spring Boot开发 “Hello World” Web应用

环境准备 由于现在很多IDE都支持Maven, 所以我们将使用Maven构建该工程: 开始之前,需要先安装Java和Maven: 本工程将基于Spring Boot 1.4.3.RELEASE开发,推荐的Java版本是Java 7+,maven版本是3.2+,可使用如下命令检查是否符合要求: 创建POM 由于使用Maven构建,所以我们首先需要创建一个pom.xml文件,用于构建本工程,打开你最喜欢的编辑器(如Notepad++),添加如下内容: <?xml version="1.0&qu

Spring学习(七)——开发Web Service的几种方式

本文作者在学习使用Java开发Web Service(不包括Restful)时,由于不知道Java有这么多框架支持开发Web Service一度陷入迷惘,不知道这些框架各有 什么不同,各有什么优缺点.经过几天的查资料.实验.失败.再查资料.再实验的过程,终于有了一个大概的了解,也把自己的学习成果跟大家分享一下: 用Java开发Web Service一般有三种方式,本文在Idea下分别使用三种方式并结合Spring容器实现了三个Demo,下面为大家一一介绍. 1.Axis.XFire和CXF方式

Spring Boot2(002):手动创建第1个SpringBoot2简单应用——“HelloWorld” web 工程

备注:以下内容参考 springboot 官方文档 https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/pdf/spring-boot-reference.pdf 中的 11. Developing Your First Spring Boot Application. 一.开发环境配置说明: 首先列一下自己的一些开发环境信息:win10 + JDK 1.8.0_111 + Apache Maven 3.3.9 + id

基于Spring框架的Web应用开发笔记 - incomplete

Motivation 最近的工作涉及Web框架搭建,在了解公司原有采用框架基础上对Web开发技术栈做了一次升级,在次做记录. Audience J2EE Web Application Developer, Spring user, Scope 快速应用开发.Web层+安全.持久层 Progress 2015/6/14 init Outline 1 用Spring Boot快速开发应用 2 Spring的Web框架和Security横切面 3 Spring Data:通用数据持久化解决方案 Co

4.IDEA用maven新建spring+springmvc+mybatis的web工程

4.IDEA新建maven+springmvc的web工程 1.新建web工程 2.导入框支持 3.配置web.xml 4.配置spring.xml 5.配置spring-mvc.xml 6.配置spring-batais.xml 7.书写POJO 8.编辑POJO的xml 9.测试访问