第一章 揭开OSGi
本书首先指出Java没有明确提供对构建模块化系统的支持,而只有普通的面向对象的数据封装。所以很多时候开发人员需要自己去弥补这方面。为了弥补这一块而让应用开发人员专注于应用的开发,OSGi服务平台应运而生。OSGi是OSGi联盟为了解决Java没有提供模块化支持而定义的一个工业标准。另外,它引入了一个新的面向服务的编程模型,也被叫做“虚拟机中的SOA”。
1.1 什么是OSGi以及为什么要用OSGi
简单的说,OSGi就是Java平台上的模块层。那什么是模块呢?模块就是软件应用的逻辑单元,各自负责相应的实现。为了讲清楚为什么要用OSGi,本书先讲了Java在模块化这方面的不足,然后介绍OSGi是如何弥补的。
1.1.1 Java在模块化方面的局限性
低层代码可见性的控制
虽然Java提供了一些控制修饰符,譬如public, protected, private或者包内的默认访问,但是它们都是用来控制这些低层数据对象的封装,而不是解决系统的逻辑单元的划分。Java使用了package关键字来分隔代码,但是只有声明为public的代码才能从另一个包访问(如果是继承关系的话,protected的代码是可以访问的)。所以如果应用的代码分布在不同的包里,而且它们需要相互访问,那就必须把那些方法设置成public的,这样的话,任何人都可以访问了。还有就是,这会暴露接口的实现细节,而导致以后如果想对实现做些修改,要考虑很多事情(很多直接调用实现代码的代码也可能需要修改)。
Java中嵌套的包看起来好像有逻辑上的关系,其实不是,它们是两个不同的包。也就是说org.foo和org.foo.hello这两个包是两个包,并没有看起来好像存在的继承关系,org.foo.hello中的类一般也只能访问org.foo中的public的类。这个嵌套的包只是为了避免包名的冲突而已,虽然很多时候它们提供了一些逻辑上代码的分割。
所以,在Java里
1. 为了防止暴露你不想公开的API,你可以把尽可能多的代码放在同一个包里(削弱应用的逻辑结构),或者
2. 使用多个包,并且暴露相应的API,来保证应用的逻辑结构
易引发错误的类路径
Java使用classpath来查找所需要的类而根本不管代码的版本,依赖以及一致性,它总是使用它最先找到的那个类。所以,你需要不断的添加库直到虚拟机停止抱怨找不到类。在比较大型的应用中,不同的组件很可能会使用相同组件的不同版本,而如果这个被使用的不同版本是不兼容的,那么这个应用就会出问题。
有限的部署和管理支持
Java中缺乏比较好的部署和管理你的应用的工具。虽然你可以使用类装载器来实现动态插入的功能,但是类装载器本身并不是用来为应用开发人员服务的常用工具。
1.1.2 OSGi也帮你什么
OSGi在你的代码运行之前会检查你的代码的依赖,OSGi会检查类路径中的库的依赖性和一致性,你可以打包并部署你需要的类(排除你不需要的),你可以明确控制你想暴露的接口,OSGi提供很强大的扩展机制(以及运行时的动态化)
1.2 OSGi大致介绍
OSGi服务平台包括两个部分:OSGi框架和OSGi标准服务。OSGi框架是实现并提供OSGi功能的运行时环境。OSGi标准服务为一些常用的任务定义了一些可重用的接口。
1.2.1 OSGi框架
OSGi联盟定义了OSGi的规范,然后第三方可以实现这个框架。比较著名的开源实现有Apache Felix,Eclipse Equinox,和Knopflerfish。OSGi规范把框架分成了3层:模块层,生命周期层和服务层。
【感觉我这个读书笔记写的过于详细和没有思想,从下面开始就结合自己的理解适当的抽象出来】
1.2.2 模块层
模块层定义了OSGi模块的概念,叫做bundle,其实就是一个jar文件以及额外的元数据。一个bundle包含你的类以及相关的资源文件。budle比普通的jar文件强大,你可以明确声明哪些包含的类是可以被外部访问的,在这一点上,bundle扩展了平常的访问修饰符(public, private, protected)。另一个强大之处在于你可以明确声明你的bundle依赖哪些外部的包。明确声明bundle提供给外部访问的类以及bundle依赖的类的好处是OSGi框架可以据此自动管理和验证你的budles的一致性,这个过程也叫budle解析。
1.2.3 生命周期层
生命周期层定义了bundle如何在OSGi框架中动态的安装和管理。生命周期层提供了两个不同的功能。在你的程序外部,生命周期层精确定义了bundle的生命周期的操作,譬如安装,更新,启动,停止和卸载。这些操作允许你动态的管理你的应用,你的bundle可以安全的加入或者移出框架而不要重启应用进程。在你的程序内部,生命周期层提供和OSGi框架交互的方式以及在运行时使用OSGi框架提供的设施。
1.2.4 服务层
这一层跟当前热门的SOA类似,就是面向服务的发布,查找和绑定:服务提供商发布他们的服务到一个服务注册部,服务的客户查找服务注册不获取服务去使用。
1.2.5 把3层结合起来
OSGi的框架是有这三层来组成的,那么我们如何在应用的开发中使用这三层呢?创建一个基于OSGi的应用主要有下面这么几步:
1. 把你的应用设计成面向接口的,以及使用这些接口的客户端
2. 使用你喜欢的工具和方法来实现服务提供方和用户组件
3. 把服务提供方和用户组件各自打包,并配以相应的OSGi元数据
4. 启动你的OSGi框架
5. 安装并启动你的组件(服务提供方和用户组件)
分享到:
相关推荐
OSGI学习笔记
NULL 博文链接:https://abstractforever.iteye.com/blog/758879
EquinoxEquinox Equinox在创建 Bundle Bundle 的 ClassLoader ClassLoader 时,首先获取 时,首先获取 时,首先获取 时,首先获取 bundle bundle bundle 的 classpath classpath classpath ,然后执行 。...
OSGi入门笔记
NULL 博文链接:https://abstractforever.iteye.com/blog/761674
本人学习osgi karaf笔记,karaf常用命令
osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍
Linux OSGi的框架搭建,使用cvm来编译文件
OSGi原理与最佳实践基于作者多年使用0SGi的经验而编写,涵盖了0SGi从/kfqN深入的知识体系,从OSGi的简介开始,介绍OSGi的作用及基本概念;其后进入OSGi实战,结合实例讲解如何基于OSGi框架编写模块...第12章 OSGi展望
OSGI原理与最佳实践的完整版,共12...第1 章OSGi 简介 第2 章OSGi 框架简介 第3 章基于Spring-DM 实现Petstore 第4 章基于Apache CXF 实现分布式Petstore 第5 章构建OSGI Bundle Repositor'y 第6 章OSGi 规范解读 ……
NULL 博文链接:https://abstractforever.iteye.com/blog/1126123
osgi自定义控制台命令一章中对应的bundle
osgi最新规范第四版, eclipse插件结构就是基于此规范编写的
资源名称:OSGI原理与最佳实践内容简介:国内第一本OSGi图书OSGi国内推广者林昊多年经验的结晶涵盖OSGi从入门到深入的知识体系引领OSGi国内研究和普及本书基于作者多年使用OSGi的经验而编写,涵盖了OSGi从入门到深入...
osgi数据库连接一章demo,c3p0配置oracle连接池和ibatis在osgi框架中的使用
利用R-OSGi实现分布式OSGi应用...然后通过一个简单的功能实现由浅入深地讲述传统 OSGi 和 R-OSGi 上的两种不同实现,让您对实际操作加深印象。最后,探讨了 R-OSGi 的目前使用情况以及整个分布式 OSGi 应用的发展前景。
把OSGI部署成一个可运行的例子,怎样 部署启动一个OSGI
NULL 博文链接:https://itway.iteye.com/blog/1545218
一个osgi例子,加压后两个文件夹,一个是源代码,一个是可运行文件 点击即可看结果