OSGI的核心 — 模块化、动态 。基于OSGi就可以模块化的开发java应用,模块化的部署java应用,还可以动态管理模块。
一、模块化
1.概念:抽象出可公用的模块以避免同一处修改在多个地方出现,重用了代码,可维护性强
2.优点:
1)多人合作开发的分工更加明确,容易控制
2)使程序实现的逻辑更加清晰,可读性强
二、OSGI概念
OSGi (Open Services Gateway initiative) 开放服务网关协议。
OSGi 联盟 OSGi Alliance。
OSGi java动态模块化系统的一系列规范。
三、OSGI核心规范
主要定义了OSGi框架。OSGi框架提供了一个通用安全可管理的Java框架,能够支持可扩展可下载的应用(即bundle)的部署。
OSGi框架是OSGi技术最基础也是最核心的部分。
OSGi框架主要分为以下几层:模块层、生命周期层、服务层。
1、模块层 — 关注打包和代码共享
模块层定义了OSGi中的模块Bundle。
Bundle是以jar包形式存在的一个模块化物理单元,里面包含了代码,资源文件和元数据(metadata),并且jar包的物理边界也同时是运行时逻辑模块的封装边界。
Bundle是开发、部署OSGi应用的基本单元。
Bundle的核心是META-INF目录下的MANIFEST.MF文件。
Bundle定义了其所包含的包的可见性、可以认为是在public/private/protected的基础上的一个扩展。
Bundle的Java包共享、屏蔽的规则。通过Export-Package、Import-Package方式进行交互。
每个Bundle都有单独的类加载器。
2、生命周期层 — 关注提供执行时模块管理和对底层OSGi框架的访问
OSGi生命周期层有两种不同的作用:
1)在应用程序外部,定义了对bundle生命周期的相关操作。OSGi生命周期层允许在执行时,从外部安装、启动、更新、停止、卸载不同的bundle,进而定制应用的配置。
2)在应用程序内部,定义了bundle访问其执行上下文的方式,为bundle提供了一种与OSGi框架交互的途径以及一些执行时的便利条件。
3、服务层 — 关注模块,特别是模块内的组件的交互和通讯
服务层支持和促成了一个灵活的应用编程模型。
涉及面向服务的发布、查找和绑定的交互模式:服务提供者将服务发布到服务注册中心,服务客户端搜索服务注册中心,查找可供使用的服务。
四、OSGI纲要规范
除了OSGi 核心规范(core specification)中的服务,OSGi联盟也定义了一组非核心的(non-core)标准服务,称为Compendium服务。
Core服务在任何运行的OSGi框架内都是可用的,这要求所有的OSGi框架都要实现核心服务。
Compendium服务则不然,这些服务以分离的bundle的形式出现,由框架实施者或者第三方实现并提供,能在任何框架上运行。
主要有如下几个:
- LOG Service (日志服务)
- HTTP Service(注册servlet和资源)
- Configuration Admin(配置管理)
- Event Admin(事件通知)
- Declarative Services(定义轻量级的面向服务的组件模型)
- Blueprint (一个类似IOC容器的实现)
五、OSGI的特点
- 复用:很多第三方的组件可以以bundle的形式进行复用。
- 简单:核心的API总过包括不超过30个类和接口。
- 适配性:这主要得益于OSGi提供的服务机制、组件可以动态的注册、获取和监听服务,使得系统能够在OSGi环境调整自己的功能。
- 版本化:bundle可以版本化,多版本能够共存而不会影响系统功能
- 懒加载:OSGi技术采用了很多懒加载机制。比如服务可以被注册,但是直到被使用时才创建。
- 非侵入式:服务可以以POJO的形式实现,不需要关注特定的接口
- 易于部署:OSGi定义了组件是如何安装和管理的,标准化的管理API使得OSGi能够和现有和将来的各种系统有机的集成。
- 动态更新:这是OSGi被最经常提起的一个特性,即所谓的“热插拔”特性,bundle能够动态的安装、启动、停止、更新和卸载,而整个系统无需重启。
- 复杂性的降低:基于OSGi的组件模型bundle能够隐藏内部实现,bundle基于服务进行交互。