OSGI学习笔记之OSGI框架
来源:互联网 发布:网络机顶盒一般多少钱 编辑:程序博客网 时间:2024/05/16 04:53
1.1 OSGi框架
OSGi框架规范中定义了框架的正确行为;而核心框架可有多种实现方式。
OSGi框架是根据OSGi规范中定义的三个概念层设计的:
1.1.1 1)模块层
模块层关注于打包、共享代码。
模块层定义了OSGi模块的概念(bundle,即包含一个元数据MANIFEST.MF的JAR文件)。
bundle比标准JAR文件更强大,它可以声明哪些包对外可见(Export-Package);所以说它扩展了Java的访问修饰符。
bundle还可以明确声明依赖哪些外部包(Import-Package),这样就可以自动地管理和验证依赖包的一致性(这个过程称为bundle解析),确保了bundle版本和其他方面约束的一致性。——这样就能清楚地看到类路径上有什么,不用到处搜寻文档了!
基于已有的JAR文件构建OSGi bundle是一个非侵入式的过程,只需要添加MANIFEST.MF:
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.
1.1.2 2)生命周期层
生命周期层关注于提供执行时模块管理、和对底层OSGi框架的访问。
生命周期层定义了在OSGi框架中是如何动态安装和管理的。目的:
在应用程序外部,生命周期层精确地定义了bundle生命周期的操作(安装、更新、启动、停止、卸载),使得你可以用一种明确的方式动态地提供、管理、改进你的应用程序,意味着可以安全滴在框架中安装和卸载bundle,而不用重启应用程序。
在应用程序内部,生命周期层定义了bundle如何访问它的执行环境。
bundle中可以将一个指定的类声明为激活器Activator,作为该bundle进行自身生命周期管理的钩子。
1. publicclass 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框架:
1. //MANIFEST.MF
2. Bundle-Activator:com.alpha.MyActivator
上例中,
在bundle启动时,会构造MyActivator实例,调用其start()方法,初始化Greeting实例;
在bundle停止时,会调用stop()方法,清除该Greeting实例。使用者可以直接使用预先配置好的实例,而不需要自己创建。
1.1.3 3)服务层
服务层关注于模块,特别是模块内的组件间的交互和通信。
服务层支持和促成了一个灵活的应用编程模型。涉及面向服务的发布、查找和绑定的交互模式:服务提供者将服务发布到服务注册中心,服务客户端搜索服务注册中心,查找可供使用的服务。
其实就是面向接口编程,不同之处在于:
1. 如何使服务的实例在程序的其他部分可用。——注册服务
2. 如何使程序的其他部分发现这个可用的服务。——检索服务
1. //注册服务
2. publicclass 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. }
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. }
1.2 创建OSGi程序的通用方法
1. 设计:将应用程序分解为一些服务接口、和这些接口的客户端。——基于接口的编程
2. 用选定的工具和方法来实现服务提供者、和客户端组件。
3. 将服务提供者、和客户端组件打包为独立的JAR,用合适的OSGi元数据扩展每个JAR。
4. 启动OSGi框架。
5. 安装启动3)中的JAR。
- OSGI学习笔记之OSGI框架
- OSGi 学习之路(1) - 概述什么是OSGi框架
- OSGi 学习之路(1) - 概述什么是OSGi框架
- OSGi 学习之路(1) - 概述什么是OSGi框架
- OSGi 学习之路 - 概述什么是OSGi框架
- OSGi 学习之路(1) - 概述什么是OSGi框架
- OSGi框架学习资料
- OSGI框架学习
- OSGI学习之路之OSGI是什么
- OSGI学习笔记
- OSGI学习笔记收藏
- OSGI学习笔记一
- OSGi 学习笔记
- osgi 学习笔记一
- osgi 学习笔记2
- osgi学习笔记
- OSGi专题学习之 01 OSGi是什么
- 1.OSGi学习之 OSGi是什么
- python opencv设置摄像头分辨率以及各个参数
- linux watch命令解析与示例
- javaweb从入门到不放弃
- Android LayoutInflater原理分析,带你一步步深入了解View(一)
- 【内功篇】C语言的输入输出浅析(四)
- OSGI学习笔记之OSGI框架
- H
- 你究竟有多了解Spring?
- 抽象
- How To Install MySQL on Ubuntu 16.04
- Max OS 安装go (解决can't load package)
- 如何异步处理繁重的业务
- 分析:手机端护照识别sdk
- ConfUtil 读取配置文件工具类