2012年参与的几个WEB项目都基于OSGI框架,本系列注记试图将个人对OSGI标准及其相关技术做一个笔记。
OSGI:
OSGI的目的在于针对大型的JAVA项目提供模块化支持,这里的模块称为bundle。bundle之所以能够实现JAVA的模块化,原理在于OSGI框架对每个bundle提供了独立的classloader,而在JVM中任何一个类是通过classloader +packet name + class name 唯一标识,因此每个bundle中的类就被隔离了。bundle和bundle之间的交互,由OSGI框架根据bundle自己的XML配置(相当于是lib/DLL中的头文件定义),调用对方的classloader实现。通常用到的OSGI框架是equinox和springDM,其中springDM严格上讲不能算是一个OSGI框架,它只是在equinox的基础上提供了spring的封装。
扩展点:
谈到OSGI还有一个经常要配合用到的技术是扩展点,扩展点最早在eclipse中被应用并流行的,我个人是这样理解的:
扩展点本身仍然是一个接口,与通常我们提到接口的差别在于,普通意义上的接口在于提供一个能力供其他模块调用,例如模块A提供接口int calc_result(unsigned int input),那么模块B在调用这个接口时相当于利用了A提供的能力calc_result。
而扩展点的意义在于提供一个接口用以扩展自己的能力,这个设计并不新鲜,我认为最典型的例子是shell(有的也叫MML模块)。shell模块处理终端给出的命令并给出相应的处理,但shell本身不会提供全部的命令处理实现,因此通常我们会这样实现,shell模块内部定义一个结构体数组,数组的每个元素包括一个命令字符串和一个函数指针,通过遍历数组匹配命令行后调用相应的函数。同时提供一个注册接口,例如int register_func(char* command, void (func*)(void))。业务模块A可以调用register_ func 将自己的一个功能注册进shell,这样一来shell模块就拥有了模块A的某个命令处理的能力,模块的功能被扩展了,register_func就可以认为是一个扩展点。
扩展点在JAVA WEB项目中最典型的应用是菜单栏,在后续的文章中再详述了。