OSGI学习札记

近段时间,因为项目中应用到OSGI框架,抽空学习了下。

 在JAVA中,是没有模块的概念的,不能把一些代码组成一个模块,然后控制哪些是可以外部使用的,哪些是可以内部使用的。
OSGi(Open Service Gateway Initiative)主要职责是为了让开发者能够构建动态化、模块化的JAVA系统。

1、OSGI有什么用?

OSGi 兼容设置可以下载和安装 OSGi Bundle,并且可以在无需使用它们时删除。这个框架以一种动态和可升级的方式在一个 OSGi 环境中管理 Bundle 的安装和更新。具体是将大的应用项目分解几个小的Bundle,每个Bundle可以有自己的类路径,精确规定哪些包和类可以被导出,需要导出那些其他Bundle的类和包,这样每个Bundle可以独立编译运行,而不需要重启服务器。

2、OSGI框架分为哪几个模块?

从结构图可以看出,框架从上到下依次为:服务层、生命周期层、模块层、可执行的环境,下面以模块层展开讲解每层的功能。

2.1、模块层

        模块层即OSGI框架所说的Bundle,说通俗一点就是包含一个元数据的MANIFEST.MF的JAR包。Bundle从形式上讲,是在META-INF目录下加入OSGi特定描述的一个jar包,也就是OSGi中的一个模块。Bundle通过配置jar包中的MANIFEST.MF,可以控制从Bundle导出的包,而没导出的包,则在Bundle外部是不能使用的,这样就能很好的完成内部类和外部类发隔离。Bundle可以被动态的安装、启动、停止和卸载,Bundle是服务(Service)和组件(Component)的载体,通过BundleContext注册和获取服务。     

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Helloworld
Bundle-SymbolicName: com.ufgov.app.helloworld
Bundle-Version: 1.0.0
Bundle-Activator: com.ufgov.app.helloworld.Activator
Bundle-Vendor: UFGOV
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Web-Folder: WebContent
Context-Path: /HelloWorld
Import-Package: javax.servlet;version="2.4.0",
 javax.servlet.http;version="2.4.0",
 javax.servlet.jsp;version="2.0.0",
 javax.servlet.jsp.el;version="2.0.0",
 javax.servlet.jsp.resources;version="2.0.0",
 javax.servlet.jsp.tagext;version="2.0.0",
 javax.servlet.resources;version="2.4.0";resolution:=optional,
 org.osgi.framework;version="1.3.0"
Bundle-ClassPath: .

这是开发过程中定义的MANIFEST.MF文件,build和导出文件之后生成

即相当于将项目中的一部分代码打包成jar,可以移除,添加。
2.2、生命周期层
     主要作用是定义Bundle的生命周期,对Bundle进行安装、更新、启动、停止、卸载这些操作。生命周期层提供了管理模块层Bundle的API,而服务层提供Bundle间的通讯模型。
可以总结为生命周期层依赖于模块层,但是不依赖安全层。
     Bundle的几个状态:INSTALLED、RESOLVED、UNINSTALLED、STARTING、ACTIVE、STOPPING。状态之间的转换关系如下:

2.3、服务层
     服务层为 Java Bundle 开发人员提供了一个动态的、简单的和一致的编程模型,它通过将服务规范和服务实现解耦来简化了服务 Bundle 的开发和部署。这个模型允许 Bundle 开发人
员来使用服务接口规范绑定到服务。服务特定实现的选择、特定需求的优化或指定的服务提供商,可以延期到运行时决定。
    
    Framework允许Bundle在运行时通过Framework的服务注册表选择一个合适的实现。Framework 这方面功能使得一个安装后的 Bundle 在部署之后可以被扩展:为新的功能安装新
的 Bundle 或在不要求重新系统下更改和更新已有的 Bundle。
   

3、Bundle之间的 交互方式

      在OSGi中,每个Bundle都有自己独立于其他Bundle的ClassLoader,各个Bundle内部的类是隔离的。Bundle之间进行交互有两种不同的方式:

3.1、通过Package的Export和Import进行交互

       提供类的Bundle对外暴露(Export)自己的一个或多个Package,而使用方则根据自己的需要导入(Import)一个或者多个Package

3.2、通过Service的方式进行。

       一个Bundle作为Servcie提供方,对外提供Service,使用者可以查找到提供的Service,并使用这个Service。

       提供/使用Service:一种是通过BundleContext(Bundle的上下文)来提供和获取,另外一种是使用DeclarativeService来实现。

 

上述表示了,Bundle怎么注册(实际上就是向OSGI框架中注册一个对象),以及怎么获取Bundle,在注册的时候可以设置这个Service的属性,而在获取Service的时候可以根据属性进行过滤(Filter)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值