`
snoopy7713
  • 浏览: 1146769 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

服务工厂 - Bundle消费者返回不同的服务对象

    博客分类:
  • OSGi
阅读更多

一般情况下,服务对象在注册后,任何其它的Bundle在请求该服务时,OSGi容器都是返回同一个对象。如果我们需要为每一个 Bundle消费者返回不同的服务对象,或者,在真正需要该服务对象时才创建。对于这些情况,我们可以创建一个实现ServiceFactory接口的 类,把该类的对象注册为服务(不是注册实际的服务对象),这样,当Bundle请求该服务时,ServiceFactory实现类将接管该请求,为每个 Bundle新建一个实际的服务对象。以下是服务工厂的使用范例源码:

 

1、服务接口及其实现类

Java代码  收藏代码
  1. public   interface  HelloService {  
  2.     public  String sayHello(String name);  
  3. }  

 

Java代码  收藏代码
  1. public   class  HelloServiceImpl  implements  HelloService {  
  2.     public  String sayHello(String name) {  
  3.         return   "Hello "  + name;  
  4.     }  
  5. }  

 

2、服务工厂类

Java代码  收藏代码
  1. public   class  HelloServiceFactory  implements  ServiceFactory {  
  2.     //当请求服务时,OSGi容器会调用该方法返回服务对象。   
  3.     //当服务对象不为null时,OSGi框架会缓存这个对象,即对于同一个消费者,将返回同一个服务对象。   
  4.     public  Object getService(Bundle bundle, ServiceRegistration serviceRegistration) {  
  5.         System.out.println("创建HelloService对象:"  + bundle.getSymbolicName());  
  6.         HelloService helloService = new  HelloServiceImpl();  
  7.         return  helloService;  
  8.     }  
  9.   
  10.     //当Bundle释放服务时,OSGi容器会调用该方法   
  11.     public   void  ungetService(Bundle bundle, ServiceRegistration serviceRegistration, Object service) {  
  12.         System.out.println("释放HelloService对象:"  + bundle.getSymbolicName());  
  13.     }  
  14. }  

 

3、Bundle激活器类

Java代码  收藏代码
  1. public   class  Activator  implements  BundleActivator {  
  2.     ServiceRegistration serviceRegistration;  
  3.       
  4.     public   void  start(BundleContext context)  throws  Exception {  
  5.         //注册服务   
  6.         HelloServiceFactory helloServiceFactory = new  HelloServiceFactory();  
  7.         serviceRegistration =  context.registerService(HelloService.class .getName(), helloServiceFactory,  null );  
  8.           
  9.         //获取服务(通过服务工厂取得)   
  10.         ServiceReference serviceReference = context.getServiceReference(HelloService.class .getName());  
  11.         HelloService selloService = (HelloService)context.getService(serviceReference);  
  12.         System.out.println("1: "  + selloService.sayHello( "cjm" ));  
  13.           
  14.         //第二次取得的服务对象与之前取得的是同一个对象   
  15.         serviceReference = context.getServiceReference(HelloService.class .getName());  
  16.         selloService = (HelloService)context.getService(serviceReference);  
  17.         System.out.println("2: "  + selloService.sayHello( "cjm" ));  
  18.     }  
  19.       
  20.     public   void  stop(BundleContext context)  throws  Exception {  
  21.         serviceRegistration.unregister();  
  22.     }  
  23. }  

 

分享到:
评论

相关推荐

    adt-bundle-windows-x86-20140624工具文件

    "adt-bundle-windows-x86-20140624工具文件"是一个专为Windows平台上的x86架构设计的Android开发工具包。这个压缩包包含了Android开发者需要的一系列核心工具,使得用户能够在本地环境中创建、调试和发布Android应用...

    swiper-bundle.min_swiper-bundle.min_swiper-bundle_Modified_jquer

    标题中的"swiper-bundle.min"指的是Swiper.js的压缩版库,这是一个流行的触摸滑动插件,常用于创建轮播图、幻灯片和其他需要滚动效果的网页元素。"swiper-bundle"通常包含了所有必要的模块,使得开发者无需额外引入...

    adt-bundle-windows-x86_64-20140624

    "adt-bundle-windows-x86_64-20140624" 是一个专为Windows 64位系统设计的Android开发工具包,它包含了开发Android应用所需的所有基本组件,是Android开发者的重要工具。这个版本发布于2014年6月24日,为当时的...

    adt-bundle-windows-x86-20140624

    "adt-bundle-windows-x86-20140624" 是一个专为Windows平台32位架构设计的Android开发工具包。这个压缩包是Google为了方便开发者进行Android应用开发而提供的集成环境,包含了所有必要的工具和软件,使得开发者能够...

    nexus-2.12.0-01-bundle

    nexus-2.12.0-01-bundle

    postgis-bundle-pg15x64-setup-3.3.2-2.exe

    postgis-bundle-pg15x64-setup-3.3.2-2.exe是一个安装程序,用于在64位操作系统上安装PostGIS和PostgreSQL扩展。PostGIS是一个开源的空间数据库扩展,它允许用户在PostgreSQL数据库中存储和查询地理空间数据。该扩展...

    adt-bundle-windows-x86_64-中文包

    下面俩个版本都能正常使用: 编译器版本号:adt-bundle-windows-x86_64-20130717 编译器版本号:adt-bundle-windows-x86_64-20130917 汉化方法: 拷贝中文包中的文件到编译器同名目录下

    adt-bundle-windows-x86_64_20140101.zip下载

    adt-bundle-windows-x86_64_20140101.zip下载,百度云盘分享链接下载

    gatling-charts-highcharts-bundle-3.3.1-bundle.zip

    标题中的"gatling-charts-highcharts-bundle-3.3.1-bundle.zip"表明这是一个包含Gatling-Charts-Highcharts-Bundle 3.3.1版本的压缩包文件。这个版本可能包含了该工具的所有组件,包括Gatling的执行引擎、Highcharts...

    hudi-hadoop-mr-bundle-0.11.0.jar

    hudi-hadoop-mr-bundle-0.11.0.jar 配合文档

    nexus-2.14.8-01-bundle.zip

    2. 配置仓库:在Web界面中,可以创建不同类型的仓库,如代理仓库、集团仓库和宿主仓库。代理仓库用于缓存和分发远程Maven仓库的依赖,宿主仓库则用于存放团队内部的jar包。 3. 发布自定义jar包:将团队的构建产物...

    nexus-2.12.0-01-bundle1111

    nexus-2.12.0-01-bundle

    swiper-bundle.min.js

    swiper-bundle.min.js

    adt-bundle-windows-x86_64-20190307

    adt-bundle-windows-x86_64-20190307, 支持android4.4、android5.1 android6.0 android7.1 android8.1 androidP

    sqlite-netFx40-setup-bundle-x86-2010-1.0.113.0.exe

    sqlite-netFx40-setup-bundle-x86-2010-1.0.113.0.exe

    gatling-charts-highcharts-bundle-2.3.1-bundle.zip

    Gatling主要用于测量基于HTTP的服务器,比如Web应用程序,RESTful服务等。 1 优点: 1.gatling和其他压力工具相比有个好处是放在同一内网环境下linux服务器上,这样避免其他压力使用办公机使用共有网络,网络情况对...

    mysql-8.0.28-1.el7.x86-64.rpm-bundle.tar

    解压这个`.tar`文件后,用户将得到一系列`.rpm`文件,这些文件分别对应MySQL的不同组件,如服务器、客户端工具、开发库等。例如,`mysql-community-server`包含数据库服务器,`mysql-community-client`包含用于与...

    postgis-bundle-pg12x64-setup-3.0.1-3.zip

    标题中的"postgis-bundle-pg12x64-setup-3.0.1-3.zip"指的是PostGIS的安装包,专为64位Windows系统设计,与PostgreSQL数据库版本12兼容,并且是3.0.1-3版。PostGIS是一个开源的地理空间扩展,它为PostgreSQL数据库...

    adt-bundle-windows-x86_64-20131030(64位, 多SDK版)

    Android 集成开发环境 adt-bundle-windows-x86_64-20131030(64位, 多SDK版) 自带Eclipse, Android SDK(2.2到4.4的SDK都有),自己下载后重新打的包

    adt-bundle-windows-x86_64-20131030.rar

    2013版adt-bundle

Global site tag (gtag.js) - Google Analytics