OSGI框架可以分为三层,模块层、生命周期层和服务层,其中模块层关注代码的打包和共享,生命周期层提供运行时管理以及对OSGI框架的访问接口,服务层关注模块之间的服务和通信
模块层定义了OSGI中的模块Bundle
模块生命周期的操作 start stop install等使外部可以动态管理系统,同时生命周期层提供的访问接口使bundle可以和OSGI框架进行交互
OSGI服务是JAVA Interface,服务的调用就是Java对象的方法调用
Bundle是一个包含了代码、资源和元数据,以Jar包形式存在的一种模块化单元,在OSGI范畴内,模块就是一个bundle,一个bundle就是一个模块。
一般来说,单个的bundle并不是完整的应用,它需要和其它bundle组合在一起才能真正发挥作用。为了能引用别的bundle的类,osgi通过import/export package的机制来控制bundle间有限地藕合。在bundle的设计时,我们将需要给其它bundle“访问”的类放在若干个package内,然后export这些package,就可以让其它bundle通过import package的方式“访问”到这些package里的类,而没被Export的package里的类则被“保护”起来。
注意:Export/Import package是通过bundle里的META-INF/manifest.mf文件里指定的。
多个Bundle满足import package依赖时,已解析的bundle优先级最高,相同优先级时,版本高的优先级高,版本相同选择最先安装的bundle
OSGI框架支持对Bundle形式的Jar实现全生命周期管理,
BundleContext部署和生命周期管理相关的接口,和与Bundle间服务交互的接口,bundle属于active状态时,BundleContext才有意义
OSGI框架拥有一个集中的服务注册中心,它遵循发布-查询-绑定模型,提供者bundle可以将传统的java对象发布为服务,使用者bundle可以找到并绑定服务
多个服务排序:
先按service.ranking由大到小排序,再按service.id由小到大排序
按属性查询:使用LDAP过滤字符串
服务使用:
每次调用getService方法时,注册中心会增加一个技术,完成service时应当告诉服务中心
服务监听:
OSGI框架为服务事件提供了一个监听API
服务追踪器