osgi学习

       OSGI 框架是一个微核结构的容器,所有的模块都需要运行在容器范围内,在 OSGI 中所有模块的部署都必须以 Bundle 的方式来进行部署, Bundle其实就是一个jar文件,这个jar文件和普通的jar文件唯一不同的地方就是Meta-inf 目 录 下 的 MANIFEST.MF 文 件 的 内 容 , 关 于 Bundle 的 所 有 信 息 都 在MANIFEST.MF中进行描述,说的时髦点,可以称它为bundle的元数据,这些信息中包含有像Bundle的名称、描述、开发商、classpath、需要导入的包以及输出的包等等。

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

       Bundle是个独立的概念,在OSGI框架中对于每个Bundle采用的是独立的classloader机制,这也就意味着不能采用传统的如引用其他Bundle的工程来实现Bundle间的协作了,那么在OSGI框架中Bundle之间是怎么协作的呢,在OSGI框架中对于每个Bundle可以定义输出的包以及引用的包,这样在Bundle间就可以共享包中的类了,尽管这样也可以直接实现简单的Bundle的协作,但在OSGI框架中更加推荐的是采用Service的方式,Service-Oriented的概念(例如SOA)大家都接触多了,OSGI框架也同样是如此的,每个Bundle可以通过BundleContext注册对外提供的服务,同时也可以通过BundleContext来获得需要引用的服务,采用Service-Oriented的方式可以使得对外提供的服务能够更加的封闭,不需要为了使用别的Bundle提供的Service而做环境依赖等的设置,同时,Bundle还可以采用Require-Bundle的方式来直接引用其他的Bundle(相当于引用其他Bundle的工程或jar),在后续的开发、发布和使用Service中将会详细的介绍如何去开发、部署、使用Service。

        Bundle从形式上讲,是在META-INF目录下的MANIFEST.MF文件中加入了OSGi特定描述的一个jar包。Bundle其实就是OSGi中的模块。Bundle的生命周期被OSGi框架所管理,具有如下几个状态:INSTALLED、RESOLVED、UNINSTALLED、STARTING、ACTIVE、STOPPING。

       Bundle通过配置jar包中的MANIFEST.MF,可以控制从Bundle导出的包,而没有导出的包,则在Bundle外部是不能够使用的。这样就很好地完成了内部类和外部类的隔离。Bundle可以被动态地安装、启动、停止和卸载。而Bundle也是服务(Service)和组件(Component)的载体。不管是通过BundleContext注册和获取服务的方式,还是通过Declarative Service进行注入的方式,都是在编写Bundle。基于OSGi的应用,就是由一个一个Bundle组成的。Bundle就是我们手中的积木,通过OSGi的框架把这些积木组织在一起,就形成了系统。

       在OSGi中,每个Bundle都有自己独立于其他Bundle的ClassLoader,正因为这样,各个Bundle内部的类是隔离的。

       Bundle之间的交互方式:

            1、通过Package的Export和Import来进行,也就是说,提供类的Bundle对外暴露(Export)自己的一个或多个Package,而使用方则根据自己的需要导入(Import)一个或多个Package。

            2、通过Service的方式进行。一个Bundle作为Service提供方,对外提供Service,使用者可以查找到提供的Service,并使用这个Service。而提供/使用Service又存在两种方式:一种是经典的做法,通过BundleContext(Bundle的上下文)来提供和获取;一种是使用Declarative Service来实现。

Service

      一个OSGi Service就是注册到OSGi框架中的一个Java对象。在注册的时候可以设置这个Service的属性。而在获取Service的时候可以根据属性进行过滤(Filter)。Bundle可以通过Bundle的上下文去注册Service或去查询Service。

      Component和Service从定义上看差不多,任何一个普通的Java对象都可以通过配置文件中的定义而变为一个Component。Component对外提供了服务并且可以使用其他Component提供的服务,Component的生命周期被OSGi框架所管理。我们可以看到,Component是提供和使用服务的另一种方式,并且具有生命周期。

      Component存在与Bundle之中,系统由多个Bundle组成。

      设计的任务是分解整个系统,划分各个部分的范围。这是一个粗略的划分,形成了Bundle。而Bundle内部会有一个或多个Component,每个Component提供独立的服务。这是Bundle内的详细设计。而最终,我们的设计形成了这样一个面向服务的组件化设计。

      Declarative Service(DS)让我们可以在Bundle中定义Component,通过配置的方式发布服务、获取服务,以帮助我们实现SOCM(Service-Oriented Component Model)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值