OSGi(Open Service Gateway Initiative)是OSGi联盟指定的一个基于java语言的动态模块化规范。
OSGi中的每个模块(称为Bundle)与普通的java类库区别不大,两者一般都以JAR格式进行封装,并且内部存储都是java Package 和class。但是一个Bundle可以声明他所依赖的java package(通过import-package描述),也可以声明他可以导出的java package(通过export-package描述)。在OSGi里面,Bundle之间的依赖关系从传统的上层模块依赖底层模块转变为平级模块之间的依赖,而且类库的可见性能得到非常精确的控制,一个模块里只有被Export过的package才能被外界访问,引入OSGi的另外一个重要理由是,基于OSGi的程序很可能可以实现模块级的热插拔功能,当程序升级更新或调试除错时,可以只停用、重新安装然后启用程序的其中一部分。
OSGi之所以有上述“诱人”的特点,要归功于他灵活的类加载器架构。OSGi的Bundle类加载器之间只有规则,没有固定的委派关系。例如,某个Bundle声明了一个他依赖的package,如果有其他Bundle声明发布了这个package,那么所有对这个package的类加载动作都会委派给发布他的Bundle类加载器去完成。不涉及某个具体的package时,各个Bundle加载器都是评级的关系,只有具体使用某个package和class的时候,才会根据package导入导出定义来狗仔Bundle间的委派和依赖。
另外一个Bundle类加载器为其他Bundle提供服务时,会根据Export-package李彪严格控制访问范围。如果一个类存在于Bundle的类库中但是没有被export,那么这个Bundle的类加载器能找到这个类,但不会提供给其他Bundle使用,而且OSGi平台不会把其他Bundle的类加载请求分配给这个Bundle来处理。
网友评论