OSGi框架

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

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

1)模块层

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

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

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

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

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

[sql] view plaincopy print?
  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. Import-Package: org.log4j;version="2.0",
  8. .....
  9. // 导出包,只有这些包对外可见
  10. Export-Package: com.alpha.interface;version="1.0",
  11. .....

2)生命周期层

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

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

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

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

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

[java] view plaincopy print?
  1. public class MyActivator implements BundleActivator {
  2. public void start(BundleContext context) {
  3. Greeting.instance = new Greeting();
  4. }
  5. public void stop(BundleContext context) {
  6. Greeting.instance = null;
  7. }
  8. }

然后将Activator通知给OSGi框架:

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

上例中,

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

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

3)服务层

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

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

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

  1. 如何使服务的实例在程序的其他部分可用。——注册服务
  2. 如何使程序的其他部分发现这个可用的服务。——检索服务
[java] view plaincopy print?
  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] view plaincopy print?
  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。

【OSGi】OSGi框架的三个层次相关推荐

  1. OSGi模块化框架详解

    OSGi模块化框架是很早就出来的一个插件化框架,最早Eclipse用它而出名,但这些年也没有大热虽然OSGi已经发布了版本1到版本5.现在用的最多的,也是本文讲述基于的是Equinox的OSGi实现, ...

  2. 带你理清Node.js 的Web框架的3个层次

    web 框架指的是处理 http.https 的服务端框架,Node.js 提供了 http.https 模块用于处理协议数据,这是 web 框架的基础. 但是 http.https 的 api 过于 ...

  3. 沈向洋、华刚:读科研论文的三个层次、四个阶段与十个问题

    来源:微软学术合作 本文约6000字,建议阅读8分钟. 阅读文章不仅是大家在科研道路上进步的必由之路,也能使我们的心智不断成长,认知模型和思维方式不断完善. 沈向洋博士:如何以正确方式打开一篇科研论文 ...

  4. 聊聊阿里面试的三个层次!

    最近去阿里的菜鸟国际做了一次面试交流,发现大公司对于面试者的知识结构考核非常严谨,可以作为我们日常工作学习的指导.虽然很多人说面试问到的东西在实际工作中很少用到,甚至有「面试造火箭,工作拧螺丝」的说法 ...

  5. nlp研究的三个层次

    写在前面的话:<凸优化>理论集成了矩阵论+泛函数分析,这门学科学好了可以使AI理论上升好几个层次.基础理论精进后就可以与物理学,计算机学以及神经生物学等学科结合搞AI基础研究---从0到1 ...

  6. AI人工智能工程师 的三个层次

    AI人工智能工程师的三个层次 01 AI工程师的三个层次 每一波浪潮的到来,都意味一片无人占领的蓝海,也意味着众多新成长起来的巨头,还意味着什么?大量的技术人员需求,供不应求的开发市场,以及从业者的高 ...

  7. 人工智能工程师的三个层次

    01 AI工程师的三个层次 每一波浪潮的到来,都意味一片无人占领的蓝海,也意味着众多新成长起来的巨头,还意味着什么?大量的技术人员需求,供不应求的开发市场,以及从业者的高薪与众多的机会. 我们最常做的 ...

  8. 而立,不惑和知天命—程序员的三个层次

    Author:AppleSeeker(冯峰) 我把我接触过的有经验的程序员分为三个层次,借用夫子的话来形容这三个层次就是:"而立","不惑"和"知天命 ...

  9. 【转】沈向洋、华刚:读科研论文的三个层次、四个阶段与十个问题

    转自知乎,微软亚洲研究院,文章<沈向洋.华刚:读科研论文的三个层次.四个阶段与十个问题> 作者:微软亚洲研究院 链接:https://zhuanlan.zhihu.com/p/163227 ...

最新文章

  1. 跳过51单片机,直接学STM32有什么严重后果?
  2. 《玩转.NET Micro Framework 移植-基于STM32F10x处理器》--微软中国.NET Micro Framework项目组工程师所作之序...
  3. mysql 创建库设置中文
  4. keepalive 原理讲解
  5. virtualenv在windows10下面使用的注意事项
  6. 《软件项目管理(第二版)》第 10 章——项目收尾 重点部分总结
  7. 视频营销:影响视频排名的五个重要因素
  8. [原]解决win2003 iis6 部署MVC 无法访问 403 的问题
  9. WebBrowser是IE内置的浏览器控件
  10. 【转】【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式
  11. golang 格式“占位符”%d,%f,%s等应用类型
  12. Luogu2257 YY的GCD
  13. 视频教程-程序员面试宝典——助你拿到好offer-招聘/面试
  14. Apowersoft ApowerMirror v1.4.5 终身商业授权破解版 安卓/iPhone投屏控制软件
  15. linux内存查看命令
  16. Android系统音乐界面UI设计,40款音乐APP界面UI设计欣赏
  17. 个人总结/IPC方法的优缺点和适用场景
  18. 那些git中常见的面试题及知识点
  19. python ez setup.py_ez_setup.py安装错误怎么解决
  20. 映客都是互刷礼物吗_映客互刷礼物有什么用_映客守护有什么用

热门文章

  1. 快手伪原创视频热门 为何要修改视频md5值
  2. 利用JS-XLSX插件 用JS读取excel数据
  3. 代码敲累了就来写《创业计划书》吧
  4. 测试屈光度软件,家长们看过来,还可以这样监测孩子的视力
  5. IE-4000-16GT4G-E 思科 IE系列交换机
  6. 启明星辰 天清汉马USG防火墙(后台弱口令/任意用户权限)
  7. migrate oracle dell,How to Migrate Oracle to PostgreSQL
  8. 合并多个HEX文件的方法
  9. 【读书笔记】《王道论坛计算机考研机试指南》第五章
  10. 全国多地新冠病例0增长,教你用Python画出当下疫情最火玫瑰图!