OSGi规范与原理(1)

一、OSGi基本概念

1. Bundle

Bundle是OSGi中的模块,其生命周期被OSGi所管理,可以被动态的安装、启动、停止和卸载。通过OSGi框架将多个Bundle组织在一起就形成了系统。每一个Bundle有独立于其他Bundle的ClassLoader,所以每个Bundle的内部实现都是隔离的。

2. Service

OSGi服务就是注册到OSGi框架当中的Java对象。在注册时可以设置这个Service的属性。在获取Service是可以根据属性进行过滤。Bundle可以根据Bundle的上下文去注册Service或查询Service。

4. DS

三种处理服务动态特性的机制:OSGi服务追踪器(Service Tracker),服务**器工具包(Service Activator Toolkit, SAT)的第三方处理机制,以及OSGi的声明式服务(Declaration Services,DS)即这里说的DS。

声明式服务不需要加载Bundle的代码来判断Bundle所需要的条件是否满足。DS以组件的方式进行工作,一个组件以两个部分构成,一个是xml文件(一般component.xml),一个是类(用于实现组件所提供的服务并接收所引用的服务)。

在DS中定义了另外一套模型:Service Component模型,每个提供服务的对象被称为一个服务组件(Service Component),所有的组件均受服务组件运行时SCR(Service Component Runtime)的管理。

二、OSGi通信方式

osgi中每个Bundle都有自己独立于其他Bundle的classloader,因此各个Bundle内部的类是隔离的。

而一个Bundle用到另外的Bundle的类,Bundle之间交互通信的实现方式有两种:

1、通过Package的导入和导出来实现,即提供类的Bundle对外暴露自己的一个或者多个Package,而使用方需要导入这些package

2、通过Service的方式。一个Bundle作为Service的提供方,对外提供Service,使用者查询到提供的Service并使用。而Service又有两种方式:

  • 经典做法,通过BundleContext上下文进行提供和获取
  • 另一种是使用Declaration Service

三、OSGi规范

  • 执行环境
  • 安全层
  • 模块层–关注与打包和共享代码
    模块层定义了OSGi模块的概念,并将之称为Bundle。Bundle是一个包含元数据的jar文件,由类文件(.class)和资源文件(.xml、.jpg、.etc…)以及元数据(Manifest.mf)组成,并且可以明确的声明哪些包对外界可见(即导出包)。

    模块层主要做的就是导包。
    动态模块化实现的是模块间的引用与隔离和模块的动态启动与停用。
    关键在于类加载架构。
    osgi中类加载器分为三类:
    父类加载器:

  • 生命周期层–关注于提供执行时模块管理和对底层OSGi框架的访问
    OSGi规范与原理(1)
    生命周期层定义了在OSGi框架中是如何动态的安装和管理。
    其存在有两个目的。一方面,在应用程序的外部精确的定义Bundle生命周期的操作(安装、更新、启动、停止、卸载)。这样可以用一种动态的方式提供、管理和改进应用程序。另一方面,在应用程序的内部,生命周期层定义了Bundle如何访问他们的执行环境。执行环境为Bundle提供一种与OSGi框架交互的方式和执行时的一些便利。
    在生命周期层的停止过程中,osgi会自动调用Activator的stop方法,执行完stop方法后,其他的bundle就不能再使用该bundle的上下文状态,即bundlecontext对象。
    而即使bundle已经停止,它导出的package仍然是可以使用的,其他的bundle仍然可以执行停止的bundle中的代码。
    只是开始bundle安装和解析的过程一定要加入所有所需bundle(未确定)
  • 服务层–关注于模块,特别是模块内的组件之间的交互和通信
    OSGi规范与原理(1)

服务层涉及的主要概念:面向服务的发布、查找和绑定交互模式,服务提供者将服务发布到服务注册中心,然后服务客户端通过搜索服务注册中心,查找可供使用的服务(如上图所示)。
服务层提倡一种基于接口的开发方式,提倡接口与实现之间的分离。
服务层包括:
1、service
服务不能孤立存在,每个服务从属并运行于提供服务的bundle上。
首先要把服务注册到所有bundle共享的服务注册表(service registry)中。其他bundle使用服务只需从注册表里查找所需服务而不与提供服务的bundle进行交互
2、service registry
服务注册表
3、service reference
4、service registration
5、service event
6、service listener

  • 框架API