OSGi系列 - 我理解的OSGi

2021年11月20日 阅读数:3
这篇文章主要向大家介绍OSGi系列 - 我理解的OSGi,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

估计不少人都接触过路由器,大部分的路由器都支持模块的热插拔,这就意味着能够在路由器运行的状态下给它动态的增长新的功能或者卸载不须要的功能,硬件界的这种热插拔技术一直就是软件界所追求的,而OSGi则使得热插拔技术在软件界成为现实。框架

 

基于OSGi的系统,能够经过安装新的Bundle﹑更新或中止现有的Bundle来实现系统功能的插拔。ide

 

那么到底什么是Bundle呢?Bundle其实就是一个jar文件,这个jar文件和普通的jar文件惟一不一样的地方就是META-INF目录下的MANIFEST.MF文件的内容,关于Bundle的全部信息都在MANIFEST.MF中进行描述,也就是说,这些都是Bundle的元数据,包含有象Bundle的名称﹑描述﹑开发商﹑classpath﹑须要导入的包以及输出的包等等。spa

 

Bundle经过实现BundleActivator接口去控制其生命周期,在Activator中编写Bundle启动﹑中止时所须要进行的工做,同时也能够在Activator中发布或者监听框架的事件状态信息,以根据框架的运行状态作出相应的调整。但同时要注意,若是框架是被相似Ctrl+C等方式强行终止的话,那么Activator中的stop方法是不会被调用的。接口

 

在OSGi框架中对于每一个Bundle采用的是独立的classloader机制,这也就意味着不能采用传统的如引用其余Bundle的工程来实现Bundle间的协做了,那么在OSGi框架中Bundle之间是怎样协做的呢?在OSGi框架中对于每一个Bundle能够定义输出的包以及引用的包,这样在Bundle间就能够共享包中的类了。尽管这样也能够实现简单的Bundle的协做,但在OSGi框架中更加推荐的是采用Service的方式。Service-Oriented的概念你们都接触多了,OSGi框架也一样是如此的,每一个Bundle能够经过BundleContext注册对外提供的服务,同时也能够经过BundleContext来得到须要引用的服务,采用Service-Oriented的方式可使得对外提供的服务可以更加的封闭,不须要为了使用别的Bundle提供的Service而作环境依赖等的设置。生命周期