第1章 OSGi简介
1.1 梦想中“即插即用”的系统
**次听到插件应该是当初用WinAMP播放器的时候,记得当时WinAMP有很多的插件,可以方便地下载、安装、使用。在实际的工作中,有过引入COM组件技术使系统模块化的经历,后来自己也做过一个产品用的插件管理器(实在不能说是插件平台),实现了基本的插件远程下载、安装、启动、停止等管理工作,也有插件问的消息通知。但是这个管理器更像是对模块的动态管理,并且在实现上也发现它远没有*初设想的简单。还有一个问题是,这个插件管理器是用在公司的**款产品上,目标是做到公司内通用,但是*终发现其实并不是那么通用,并且这个管理器也有些相关平台。当时就在想,有没有一个通用的框架,实现一个插件体系结构,使用者遵循规范,开发自己的插件,使用已有的插件,而插件又能控制对外暴露的内容,在运行时,可以动态地安装、启动、停止、卸载插件,每个插件提供一个或多个服务,其他的插件只是根据接口来获取服务提供者,而完全不知道提供者是谁。如果有了这样的规范和框架,我们就可以用已有的积木搭出各种造型,也能够提供积木给自己、给别人来使用。所以,我们很希望能够有一个稳定的平台,管理规范的插件,插件可以热插拔,并且在运行期能够改变行为。
1.2 0SGi,拯救Java模块化的规范
在Java中,是没有模块的概念的。我们不能把一些代码组成一个模块,然后控制哪些是可以外部使用的,哪些是内部使用的。我们能用的主要有两个办法,一个是把一些内部使用的类赋予包内访问权限,但是这样在内部使用上会很不方便,因为使用这个类的类和这个类本身要在同一个包下;另外一个办法是通过文档告知它是内部类,不能在外部使用,但是这种限制很容易被忽略。而内部类被外部使用的后果是,不能轻易调整接口,因为不知道内部类是否被外部使用了。如果调整,可能会导致外部系统受很大影响。难道就没有一种机制来保证我们只暴露想暴露的部分给外部么?
……