博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【OSGi】OSGi框架的三个层次
阅读量:3588 次
发布时间:2019-05-20

本文共 2343 字,大约阅读时间需要 7 分钟。

OSGi框架

OSGi框架规范中定义了框架的正确行为;而核心框架可有多种实现方式。

OSGi框架是根据OSGi规范中定义的三个概念层设计的:

1)模块层

模块层关注于打包、共享代码。

模块层定义了OSGi模块的概念bundle,即包含一个元数据MANIFEST.MF的JAR文件)。

bundle比标准JAR文件更强大,它可以声明哪些包对外可见(Export-Package);所以说它扩展了的访问修饰符。

bundle还可以明确声明依赖哪些外部包(Import-Package),这样就可以自动地管理和验证依赖包的一致性(这个过程称为bundle解析),确保了bundle版本和其他方面约束的一致性。——这样就能清楚地看到类路径上有什么,不用到处搜寻文档了!

基于已有的JAR文件构建OSGi bundle是一个非侵入式的过程,只需要添加MANIFEST.MF:

[sql]   
 
  1. // MANIFEST.MF  
  2. Bundle-ManifestVersion: 2  
  3. Bundle-Name: Greeting API  
  4. Bundle-SymbolicName: com.alpha.interface  
  5. Bundle-Version: 1.0  
  6.   
  7. // 导入包,  
  8. Import-Package: org.log4j;version="2.0",  
  9. .....  
  10.   
  11. // 导出包,只有这些包对外可见  
  12. Export-Package: com.alpha.interface;version="1.0",  
  13. .....  
  14.    

2)生命周期层

生命周期层关注于提供执行时模块管理、和对底层OSGi框架的访问。

生命周期层定义了在OSGi框架中是如何动态安装和管理的。目的:

在应用程序外部,生命周期层精确地定义了bundle生命周期的操作(安装、更新、启动、停止、卸载),使得你可以用一种明确的方式动态地提供、管理、改进你的应用程序,意味着可以安全滴在框架中安装和卸载bundle,而不用重启应用程序

在应用程序内部,生命周期层定义了bundle如何访问它的执行环境。

bundle中可以将一个指定的类声明为激活器Activator,作为该bundle进行自身生命周期管理的钩子。

[java]   
 
  1. public class MyActivator implements BundleActivator {  
  2.   
  3.   public void start(BundleContext context) {  
  4.       Greeting.instance = new Greeting();  
  5.   }  
  6.   
  7.   public void stop(BundleContext context) {  
  8.       Greeting.instance = null;  
  9.   }  
  10. }  
然后将Activator通知给OSGi框架:

[plain]   
 
  1. // MANIFEST.MF  
  2. Bundle-Activator: com.alpha.MyActivator  

上例中,

在bundle启动时,会构造MyActivator实例,调用其start()方法,初始化Greeting实例;

在bundle停止时,会调用stop()方法,清除该Greeting实例。使用者可以直接使用预先配置好的实例,而不需要自己创建

3)服务层

服务层关注于模块,特别是模块内的组件间的交互和通信。

服务层支持和促成了一个灵活的应用编程模型。涉及面向服务的发布、查找和绑定的交互模式:服务提供者将服务发布到服务注册中心服务客户端搜索服务注册中心,查找可供使用的服务。

其实就是面向接口编程,不同之处在于:

  1. 如何使服务的实例在程序的其他部分可用。——注册服务
  2. 如何使程序的其他部分发现这个可用的服务。——检索服务

[java]   
 
  1. // 注册服务  
  2. public class Activator implements BundleActivator {  
  3.   //在start()中用BundleContext.registerService()注册服务  
  4.   public void start(BundleContext context) {  
  5.       context.registerService(Greeting.class.getName(), new GreetingImpl(), null);  
  6.   }  
  7.   //无需在stop()中注销服务,因为bundle停止时会自动注销该bundle中已注册的服务  
  8.   public void stop(BundleContext context) {}  
  9. }  

[java]   
 
  1. // 检索服务  
  2. public  class Client implements BundleActivator {  
  3.   public void start(BundleContext context) {  
  4.       // 1、从服务注册表中检索间接的“服务引用”  
  5.       ServiceReference ref = context.getServiceReference(Greeting.class.getName());  
  6.       // 2、使用“服务引用”去访问服务对象的实例  
  7.       ((Greeting) context.getService(ref)).sayHello();  
  8.   }  
  9.   public void stop(BundleContext context) {}  
  10. }  


创建OSGi程序的通用方法

  1. 设计:将应用程序分解为一些服务接口、和这些接口的客户端。——基于接口的编程
  2. 用选定的工具和方法来实现服务提供者、和客户端组件。
  3. 将服务提供者、和客户端组件打包为独立的JAR,用合适的OSGi元数据扩展每个JAR。
  4. 启动OSGi框架。
  5. 安装启动3)中的JAR。

转载地址:http://dkpwn.baihongyu.com/

你可能感兴趣的文章
学习Java Socket网络编程(三)
查看>>
Java方法参数之参数传递方式
查看>>
mysql安装和配置ODBC驱动,然后tableau链接MySQL数据库
查看>>
以项目为导向,助您入门python之网络爬虫-爬取京东商品plus价格低于原价5折的商品(三)
查看>>
物联网之智能灯开发-前言
查看>>
物联网之智能灯-Django(一)
查看>>
使用计算机视觉技术进行工业品质检测
查看>>
Java重要知识点——方法的定义
查看>>
LinkedHashSet的使用
查看>>
HashSet的使用——双色球配对问题
查看>>
爬虫手记(scrapy实现断点续爬,文章重点在设置)使用scrapy_redis
查看>>
maven 命令行打包
查看>>
Sourcetree卡顿优化
查看>>
怎么通过Excel导入sqlserver数据库(无废话)
查看>>
微信公众号开发-自定义菜单(无需代码)
查看>>
快速了解IDEA中Maven模块里各功能作用
查看>>
Navicat中update语句出现 将截断字符串或二进制数据 错误
查看>>
Elasticsearch查询、精确查询、统计数量和删除
查看>>
wangEditor上传不了图片
查看>>
PageHelper快速上手
查看>>