OSGI 学习笔记之一 初识
OSGI - (Open Service Gateway Initiative) OSGI 定义了一个动态的模型系统,帮助你更好地管理你的代码结构,管理代码生命周期,和代码模块之间的相互合作(松散的)。
模块性-代码被分为清晰的功能块,功能块之间有清晰的接口交互。
大家自然会想到面向对象已经具有模块的概念了。但是还是有局限性:
1.低级别的可见性控制。只能对方法,类,包进行控制。但这些都是代码级别的,不是业务级别的。
有时候将接口和实现定义在不同的包里边,这样比较符合代码模块逻辑,但是大家一定有体会,实现的类一般回多暴漏一些方法,来进行一个配置等接口没有要求的方法。
这些多余的方法并不受接口的约束。第三方使用者可能会使用,就会有变更不一致的问题。
还有一种可能就是定义和实现在一个包里,这样可以只对外暴漏接口规定的方法,但是导致代码结构混乱。
然后我们在另一个package
2.易于出错的class path
class path在一定程度上阻碍了java的模块化。因为class path对jar的版本没有概念,它只返回它找到的第一个版本。
3.缺乏部署和管理的支持
OSGI 的架构:
OSGI service platform包括 OSGI framework 和 standard services两个部分。framework是这个系统的运行时环境,提供OSGI的基本功能,而standard services提供一些可重用的通用功能比如Logging和Preferences。
OSGI标准包括三个层,从下到上依次为Module,lifecycle,service
Module 层,封装和共享代码
lifecycle层,运行时的module管理和提供对OGSI底层服务调用的接口。
service层,提供容器来管理module,并且协调module之间的交互。
下边具体说一下每个层:
MODULE 层
这一层定义了OSGI的模块的概念,叫做bundle,这是几个jar和一个额外的metadata。一个bundle包含了你的class文件和他们需要的资源。bundle比普通的jar更强大,因为你可以显式的指定bundle里包含的哪个package是可以对外可见的。也可以显示的指定哪个外部的package是这个bundle需要的。这种显示的定义一个bundle的import和export的package,这样OSGI framwork可以帮我们来检查他们的一致性。
LIFECYCLE层
lifecycle层定义了bundle是如何动态的被安装和管理的。
对外而言lifecycle层提供了让你可以动态的安装卸载,更新,启动,停止的功能。
对内而言lifecycle层让bundle可以获取执行时的上下文,这样bundle可以和OSGI framework去交互,
SERVICE 层
Service层是接口和实现分离的,service可以随时注册和取消。这样提高了程序的灵活性。
说了这么多,我们到底该怎么用OSGI来编写我们自己的程序呢?
1.把你的程序设计成接口-实现的结构。
2.实现这些接口,和这些接口的使用者。
3.把服务提供者和客户封装到不同的jar里,给每个jar加上合适的metadata。
4.打开OSGI framework。
5.安装和启动你的jar。