断断续续心不在焉地看了一天OSGi相关的东西,照着Apache Felix的Tutorials跑了一遍,大概有个概念了。
我理解OSGi作为一个容器,最大的特点莫过于支持软件模块的热插拔了。与Spring这样传统的容器不同,Spring在初始化的时候就根据xml配置文件完成了模块(在Spring来说是bean)的注册,运行时仅仅管理依赖注入和scope等问题了,是reflection级别的。OSGi在相对更底层一些的ClassLoader级别做文章(这块还没细看,bluedavy的某篇opendoc有简单的介绍),实现了一种在容器运行时注册、反注册模块(对OSGi来说是Bundle)的机制,优点好处不言而喻。
OSGi对Bundle的管理,每个Bundle可以输出接口,也可以引用其他Bundle的接口,从而Bundle间形成依赖关系。接口在容器中注册,容器管理相关的依赖关系,形成一个类似注入的机制。
对Apache Felix来说,每一个Bundle需要有一个Activitor,定义Bundle启用和禁用时所需执行的逻辑。每个Bundle的元信息定义在jar的manifest中,包括服务的名字、Activitor类的路径、导入是导出的接口等。
Spring的一个子项目Dynamic Moudle致力于将OSGi的机制与既有的给予Spring系统的代码结合,是Spring的系统适应OSGi,支持动态特性。
暂时还只有这些粗浅的认识,目前我还想不出如何针对这些特性把它应用到我已有的项目里,或者针对这种特性开始一个新的项目。
不过话说回来了,其实我每日的工作就是在Eclipse的OSGi平台Equinox上进行的,只不过是隔了太多层,我已然感觉不到它的存在了。想想也是,为什么我们每次修改插件的代码后运行无需重启Eclipse呢。

