- 浏览: 154891 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
驭乐MJ:
好!谢谢啦!正在学习使用sean中。。
Seam学习笔记 -
laorer:
00 -现在,互联网造就了一批富翁,但那时,似乎什么都不会去想 ...
如果时光能够回流到八年前 -
liuqizhi0925:
八年前,OMG ,能改变的事情真的很多...
如果时光能够回流到八年前
借助网上的一些资料,对OSGi有了一些了解,将到目前的一些粗浅认识记录如下,由于自己对J2EE比较熟悉,所以借助与J2EE的对比来认识OSGi。
Module
OSGi中具体实现Module的单位是bundle,一个bundle就是一个jar文件,其中包含所需的类文件和资源文件,同时必须包含一个描述文件;每个bundle都可以被独立打包、部署。看到这里,你是否会觉得跟J2EE中的WAR定义很类似?
单从形式上来看,它们的确非常相似,而且它们的区别主要在于:
1)J2EE的WAR文件的粒度很大,是以应用为单位的;而OSGi bundle的粒度则相对小很多,以一组服务为单位,一个OSGi应用将包含多个bundle。
2)最重要的差别是,bundle之间可以通过共享java package、发布或者引用服务进行协作。而Web应用之间几乎是不存在协作的,起码在定义上没有。
3)在J2EE中,可以将多个war文件打包成为一个ear文件进行部署,而OSGi/bundle则没有这种"Application"的概念,每个bundle都必须独立部署。
Life Cycle
bundle拥有自己的生命周期,可以被安装、启动、激活、停止等,这一点与J2EE中的WAR也非常相似。不过由于不存在协作关系,WAR的生命周期相对简单,只关心自己能否启动则可。而bundle在被激活之前,必须保证其依赖的其他bundle已经存在。
Class Loading
在J2EE Servlet规范中,对ClassLoader的着墨不多,不过目前各产品的实现都比较类似,就是每个WAR文件有一个独立的ClassLoader。如下图,由于WebApp1和WebApp2使用不同的ClassLoader,因此它们可以使用同一个Java Class的不同版本:
在这张图中我们可以看到Catalina用独立的ClassLoader,这是一个进步。早期很多人都遇到过这样的问题,自己的应用中采用了某个开源软件,部署的时候却无法正常运行。其原因是服务器已经采用了该开源软件的较老版本,而自己的应用却依赖与新版本。新版本的Tomcat则把自己依赖的类库放在Catalina分支,这样这些类库对所有WebApp都不可见。同时由Shared负责的类库则是所有WebApp都能够用到。
这样的ClassLoader结构对于WebApp来说已经相当不错,但是仍然有一个问题没有解决,那就是如果WebApp1需要用到WebApp2的类怎么办?对于WebApp来说,这种需求的确相当罕见,因为应用与应用之间一般不会出现之间的类引用。但是对于一个应用中的多个模块,相互引用则是再正常不过了。
论坛上正好有个帖子“有关于classloader的思考(或者说是困惑)”整理了这方面的需求,我则无需重复。楼主edge_hh的问题用OSGi则可以很简单解决:
1. 在模块A的配置文件说明"Export-Package: demo.a.httpservice"
2. 在模块B的配置文件说明"Import-Package: demo.a.httpservice"
3. 将所有httpservice接口需要的定义放置在模块A的demo.a.httpservice下
这样就可以了。这就是OSGi的特别之处,bundle的CloassLoader是平级的,但平级的CloassLoader之间可以共享Java Package。
Delcare Services
在edge_hh的帖子中,他没有明确提出的一个问题是,模块B是如何调用模块A的服务?
在Java WebApp中,是不存在跨WebApp的服务调用,forward和include操作都是局限在同一个WebApp中。EJB中用<ejb-ref>来描述对EJB的引用,不过这种引用方式就如人们对EJB2的批评一样,复杂、不方便使用。
实际上在服务引用这方面,大家更加熟悉的应该是Spring的方式,如下:
不过在这种场合下Spring存在的问题有:
1. Spring没有"module"的概念,难以说明“一个module包含多个service”这样的情况
2. Spring的DI是静态的,一旦建立就不会更改。而在模块化的程序中,一个模块在运行时也有卸载、重新部署的时候。Spring无法处理这种情况。
让我们来看看OSGi的做法,下面的配置代码来自《OSGI 实战》的例子:
1)声明服务:
2)引用服务:
其中特别的部分是bind和unbind的设定。通过bind和unbind,服务消费者能够知道所需服务对应模块的启动和停止,从而实现了DI的动态绑定。
"OSGi technology is the dynamic module system for Java!"
在学习OSGi之前,盛名之下,总觉得OSGi是很复杂的技术;然而在初步了解OSGi后,又觉得它非常简单,或者说是如此的清晰明了。我初步认识到OSGi的主要好处是:
1)明确定义了Moduel/Service的。
“我们的应用/系统是模块化的”,这是一句常常能听到的话语,然而个模块的具体实现方式恐怕每个应用都不尽相同,这种情况非常不利于开发团队积累可重用的模块。现在通过OSGi的严格定义,有望形成一个标准的模块市场,Eclipse的Plug-in就是一个很好的例子。即便只是在公司范围内形成模块仓库,都将对开发效率有极大提高。当然一个相当规模的模块市场,必然是依赖于一套设计良好的Service接口的。
2)运行时的动态性。
服务具体由哪个模块提供,模块的安装、启动、停止、卸载,这些都可以在运行时指定,并且随时更改。这样的情况下,应用的动态性就取决于你的想象力了。举一个实在的例子,我们无需重新启动整个应用,就能够对应用进行打补丁、升级。
推荐读物:《OSGi 实战》Opendoc,喜欢其中清晰明了的例子。
Module
OSGi中具体实现Module的单位是bundle,一个bundle就是一个jar文件,其中包含所需的类文件和资源文件,同时必须包含一个描述文件;每个bundle都可以被独立打包、部署。看到这里,你是否会觉得跟J2EE中的WAR定义很类似?
单从形式上来看,它们的确非常相似,而且它们的区别主要在于:
1)J2EE的WAR文件的粒度很大,是以应用为单位的;而OSGi bundle的粒度则相对小很多,以一组服务为单位,一个OSGi应用将包含多个bundle。
2)最重要的差别是,bundle之间可以通过共享java package、发布或者引用服务进行协作。而Web应用之间几乎是不存在协作的,起码在定义上没有。
3)在J2EE中,可以将多个war文件打包成为一个ear文件进行部署,而OSGi/bundle则没有这种"Application"的概念,每个bundle都必须独立部署。
Life Cycle
bundle拥有自己的生命周期,可以被安装、启动、激活、停止等,这一点与J2EE中的WAR也非常相似。不过由于不存在协作关系,WAR的生命周期相对简单,只关心自己能否启动则可。而bundle在被激活之前,必须保证其依赖的其他bundle已经存在。
Class Loading
在J2EE Servlet规范中,对ClassLoader的着墨不多,不过目前各产品的实现都比较类似,就是每个WAR文件有一个独立的ClassLoader。如下图,由于WebApp1和WebApp2使用不同的ClassLoader,因此它们可以使用同一个Java Class的不同版本:
+-----------------------------+ | Bootstrap | | | | | System | | | | | Common | | / \ | | Catalina Shared | | / \ | | WebApp1 WebApp2 | +-----------------------------+(from http://tomcat.apache.org/tomcat-4.1-doc/class-loader-howto.html)
在这张图中我们可以看到Catalina用独立的ClassLoader,这是一个进步。早期很多人都遇到过这样的问题,自己的应用中采用了某个开源软件,部署的时候却无法正常运行。其原因是服务器已经采用了该开源软件的较老版本,而自己的应用却依赖与新版本。新版本的Tomcat则把自己依赖的类库放在Catalina分支,这样这些类库对所有WebApp都不可见。同时由Shared负责的类库则是所有WebApp都能够用到。
这样的ClassLoader结构对于WebApp来说已经相当不错,但是仍然有一个问题没有解决,那就是如果WebApp1需要用到WebApp2的类怎么办?对于WebApp来说,这种需求的确相当罕见,因为应用与应用之间一般不会出现之间的类引用。但是对于一个应用中的多个模块,相互引用则是再正常不过了。
论坛上正好有个帖子“有关于classloader的思考(或者说是困惑)”整理了这方面的需求,我则无需重复。楼主edge_hh的问题用OSGi则可以很简单解决:
1. 在模块A的配置文件说明"Export-Package: demo.a.httpservice"
2. 在模块B的配置文件说明"Import-Package: demo.a.httpservice"
3. 将所有httpservice接口需要的定义放置在模块A的demo.a.httpservice下
这样就可以了。这就是OSGi的特别之处,bundle的CloassLoader是平级的,但平级的CloassLoader之间可以共享Java Package。
Delcare Services
在edge_hh的帖子中,他没有明确提出的一个问题是,模块B是如何调用模块A的服务?
在Java WebApp中,是不存在跨WebApp的服务调用,forward和include操作都是局限在同一个WebApp中。EJB中用<ejb-ref>来描述对EJB的引用,不过这种引用方式就如人们对EJB2的批评一样,复杂、不方便使用。
实际上在服务引用这方面,大家更加熟悉的应该是Spring的方式,如下:
<beans> <bean id="ModuleA" class="demo.a.httpservice.HttpService"/> <bean id="ModuleB" calss="demo.b.Consumer"> <property name="httpService"> <ref bean="ModuleA"/> </property> </beans>
不过在这种场合下Spring存在的问题有:
1. Spring没有"module"的概念,难以说明“一个module包含多个service”这样的情况
2. Spring的DI是静态的,一旦建立就不会更改。而在模块化的程序中,一个模块在运行时也有卸载、重新部署的时候。Spring无法处理这种情况。
让我们来看看OSGi的做法,下面的配置代码来自《OSGI 实战》的例子:
1)声明服务:
<?xml version="1.0" encoding="UTF-8"?> <component name="DBValidator"> <implementation class="org.riawork.demo.service.user.impl.DBValidatorImpl"/> <service> <provide interface="org.riawork.demo.service.user.Validator"/> </service> </component>
2)引用服务:
<?xml version="1.0" encoding="UTF-8"?> <component name="LoginServlet"> <implementation class="org.riawork.demo.web.servlet.LoginServlet"/> <reference name="ValidatorService" interface="org.riawork.demo.service.user.Validator" bind="setValidator" unbind="unsetValidator" policy="dynamic" cardinality="0..1"/> <reference name="HttpService" interface="org.osgi.service.http.HttpService" bind="setHttpService" unbind="unsetHttpService" policy="dynamic"/> </component>
其中特别的部分是bind和unbind的设定。通过bind和unbind,服务消费者能够知道所需服务对应模块的启动和停止,从而实现了DI的动态绑定。
"OSGi technology is the dynamic module system for Java!"
在学习OSGi之前,盛名之下,总觉得OSGi是很复杂的技术;然而在初步了解OSGi后,又觉得它非常简单,或者说是如此的清晰明了。我初步认识到OSGi的主要好处是:
1)明确定义了Moduel/Service的。
“我们的应用/系统是模块化的”,这是一句常常能听到的话语,然而个模块的具体实现方式恐怕每个应用都不尽相同,这种情况非常不利于开发团队积累可重用的模块。现在通过OSGi的严格定义,有望形成一个标准的模块市场,Eclipse的Plug-in就是一个很好的例子。即便只是在公司范围内形成模块仓库,都将对开发效率有极大提高。当然一个相当规模的模块市场,必然是依赖于一套设计良好的Service接口的。
2)运行时的动态性。
服务具体由哪个模块提供,模块的安装、启动、停止、卸载,这些都可以在运行时指定,并且随时更改。这样的情况下,应用的动态性就取决于你的想象力了。举一个实在的例子,我们无需重新启动整个应用,就能够对应用进行打补丁、升级。
推荐读物:《OSGi 实战》Opendoc,喜欢其中清晰明了的例子。
发表评论
-
Weblogic的update和stop/start的区别
2009-10-28 19:50 2173Weblogic的update和stop/s ... -
Web Service HTTP1.0 and HTTP1.1性能测试报告
2009-10-21 17:55 3097第1章 测试需求分析 1.1 测试目的 w ... -
SOA与业务敏捷
2006-08-30 00:00 815作者:TIBCO中国研发中心 胡长城(银狐999) ... -
RESTful Web Services
2006-08-23 00:00 9601. The Fundamental 1.1 What ... -
CAS学习笔记
2006-08-02 00:00 1245•相关文档 官方文档: http://www.ja- ... -
SOA学习笔记
2006-07-26 00:00 919SOA是为了解决在Internet ... -
Lucene 基础指南[转]
2006-07-12 00:00 1265Lucene 基础指南 作者:lighter, 江南白衣 ... -
x509数字证书介绍
2006-06-28 00:00 1295一、什么是数字证书 数字证书就是互联网通讯中标志通讯各方身 ... -
SSL协议及其应用
2006-06-21 00:00 2084SSL协议及其应用 ... -
JSR 168与WSRP
2006-06-07 00:00 1581作者:Rachel Greenblatt ... -
JBoss学习笔记
2006-05-31 00:00 1354JBoss架构是由JMX MBean服务器、微内核组成的。 ... -
UDDI笔记
2006-05-24 00:00 1085◆UDDI的目的实际上是想提供一个针对公众网商业用户的在全 ... -
选择Seam的十大理由
2006-05-17 00:00 943一、增加AJAX特征的最快捷方式 在功能上,Ajax改变了W ... -
Seam学习笔记
2006-05-10 00:00 1352FAQ: seam的英文意思是:缝、接合处。seamless ... -
JSF学习笔记
2006-05-03 00:00 2832FAQ: 1. JSF跟Spring如何结合? A ... -
Spring学习笔记
2006-04-26 00:00 1057Spring笔记 0. 背景 Spring F ... -
iBATIS学习笔记
2006-04-19 00:00 13881. iBATIS 关于iBATIS,iBATIS是一个Da ... -
Hibernate's FAQ
2006-04-05 00:00 7801. 关于session 1) 什么时机对session ... -
Hibernate学习笔记
2006-03-29 00:00 939● 相关文档: Hibernate参考文档 v3.0.2 ... -
JMX学习笔记
2006-03-22 00:00 998JMX 笔记 一些JMX的简单入门资料如下: ...
相关推荐
OSGi(Open Services Gateway Initiative)是一种Java平台上的模块化服务框架,它定义了一种标准,使得开发者能够构建可互操作的、动态的、模块化的软件系统。OSGi的核心概念是基于Java的模块化,它的主要目标是为...
在本入门资料中,我们将探讨OSGI的关键概念、优势以及如何通过实战和最佳实践来掌握它。 1. OSGI原理: OSGI的核心在于它的模块系统,称为“bundle”。一个bundle是一个自包含的Java模块,包含了类、资源和元数据...
OSGi的入门资料,网上找的,初探OSGi 的全文
标题"OSGI入门和例子"意味着我们将探讨OSGI的基本概念以及如何通过实例来学习和理解这个框架。下面,我们将深入讨论OSGI的关键知识点: 1. **模块系统**:OSGI的核心是模块化,它定义了一种基于Java导出和导入包的...
学习OSGI入门和整合Spring,对于开发复杂的企业级应用,或者想要提升系统灵活性和可维护性的开发者来说,是非常有价值的。通过理解OSGI的模块化机制和Spring的依赖注入原理,可以构建出更加高效和可扩展的Java应用。
OSGi(Open Services Gateway Initiative)学习笔记(一) 在IT领域,OSGi是一种模块化系统和Java服务平台,它提供了一种动态管理软件组件的能力。本文将深入探讨OSGi的基本概念、架构以及如何使用它来构建可扩展和...
很基础全面的OSGI ppt教程,讲解的很详细。
在本篇“osgi学习笔记(二)”中,我们将深入探讨OSGi(Open Services Gateway Initiative)框架的核心概念、工作原理以及如何在实际项目中应用它。OSGi是一种Java模块化系统,它允许开发人员创建可独立更新和依赖...
《OSGI入门和整合Spring》则关注OSGI与Spring框架的结合,主要讨论: 1. **Spring与OSGI集成原理**:Spring的bean管理如何与OSGI服务机制相结合,实现更灵活的依赖注入。 2. **Declarative Services(DS)**:利用...
### Spring OSGi 入门知识点...以上内容为Spring OSGi入门的基本知识点,涵盖了Spring DM的基础概念、配置方法以及如何在OSGi环境中导出和引用服务等内容。这些知识点对于理解如何将Spring与OSGi结合使用具有重要意义。
Spring OSGi 是一个将 Spring 框架与 OSGi(Open Service Gateway Initiative)容器相结合的开源项目,旨在提供一种在 ...提供的压缩包文件可能包含了入门手册和示例代码,这些资源将有助于你快速上手 Spring OSGi。
OSGI(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序分解为独立的模块,称为bundle,每个bundle包含自己的类加载器和资源。这些bundle可以通过动态安装、启动、停止、更新和卸载...
**入门篇** 1. **模块系统**:OSGi的核心是模块化,每个模块称为一个Bundle,它包含类、资源和元数据。Bundle之间通过导出和导入包来实现依赖关系。 2. **生命周期管理**:OSGi Bundle有启动、停止、安装、更新和...
下面将详细介绍Spring OSGi的基本概念、优势以及如何入门。 一、Spring OSGi 基本概念 1. Spring Framework:Spring是一个全面的Java企业级应用开发框架,提供依赖注入、AOP(面向切面编程)、数据访问、事务管理...
### OSGi 入门与实践 #### OSGi 的历史背景 OSGi,全称为 Open Service Gateway Initiative,从字面上理解,它最初被设计为一个面向服务的平台。1999 年,OSGi 联盟成立,旨在为通过网络向设备提供服务建立开放的...
在OSGI入门阶段,首先要理解的是它的基本概念,如bundle(模块)、服务、生命周期管理和依赖管理。Bundle是OSGI中的核心组件,它类似于Java的JAR文件,但具有自己的元数据和生命周期。每个bundle可以导出和导入服务...