关闭

关闭

封号提示

内容

首页 OSGI入门和整合Spring.pdf

OSGI入门和整合Spring.pdf

OSGI入门和整合Spring.pdf

上传者: 07122294 2014-02-15 评分1 评论0 下载1 收藏0 阅读量741 暂无简介 简介 举报

简介:本文档为《OSGI入门和整合Springpdf》,可适用于IT/计算机领域,主题内容包含OSGI入门和整合Spring概述本文用于OSGI基本入门并添加对Spring的整合本文假设读者对Eclipse、OSGISpring的概念和用法有符等。

OSGI入门和整合Spring概述本文用于OSGI基本入门并添加对Spring的整合本文假设读者对Eclipse、OSGISpring的概念和用法有基本了解本文仅供参考希望起到抛砖引玉的效果希望对大家能有帮助能节省一点查资料的时间就善莫大焉了。若发现纰漏和疑问望不吝指教EMail:Caichaoweigmailcom。感谢PowerpiggyHypaspist的指导和帮助。蔡超伟年月一、创建提供服务的OSGIBundle创建一个Plugin工程填入工程名如图选择直接下一步然后点击Finish会显示如下图:选择Dependencies添加点击debug的虫子图标选择OpenDebugDialog…出现下图界面后保证在Workspace中选择刚创建的bundle在点击“AddRequiredBundles”,确保如下个被选中:orgeclipseosgiorgeclipseosgiservicesorgeclipseequinoxds注意最后一个orgeclipseequinoxds需要手工指定该包如果你的Eclipse下没有则需要下载安装只有具有该jar包才能从以配置文件的方式注册服务(见后述的servicexml文件)。点击Debug后在控制台显示至此一个最基本的Bundle就完成了但此时它还不能对外提供任何服务。创建一个接口IDisplay并且创建一个实现类Display实现其显示信息的方法setDescInfor内容就是将传入的参数在控制台打印出来项目结构如图:文件内容如下:***IDisplayjava*publicclassDisplayimplementscominfotechbprautodisplaydisplayIDisplay{publicvoidsetDescInfor(StringstrInfor){Systemoutprintln(strInfor)}}***Displayjava*packagecominfotechbprautodisplaydisplayimportorgosgiservicecomponentComponentContextpublicclassDisplayimplementscominfotechbprautodisplaydisplayIDisplay{publicvoidsetDescInfor(StringstrInfor){Systemoutprintln("显示:"strInfor)}*activate方法会在Bundle加载完毕后自动调用deactivate会在Bundle卸载时自动调用。*protectedvoidactivate(ComponentContextcontext){Systemoutprintln("显示器激活")}protectedvoiddeactivate(ComponentContextcontext){Systemoutprintln("显示器卸载")}}***Activatorjava*packagecominfotechbprautodisplayimportorgosgiframeworkBundleActivatorimportorgosgiframeworkBundleContextpublicclassActivatorimplementsBundleActivator{publicvoidstart(BundleContextcontext)throwsException{Systemoutprintln("显示组件启动")}publicvoidstop(BundleContextcontext)throwsException{Systemoutprintln("显示组件停止")}}创建一个叫OSGIINF的目录下面创建一个名为servicexml的文件内容如下:<xmlversion=""encoding=""><componentname="DisplayService"><implementationclass="cominfotechbprautodisplaydisplayDisplay"><service><provideinterface="cominfotechbprautodisplaydisplayIDisplay"><service><component>上述内容的含义为声明一个名为DisplayService的组件它对外提供接口Idisplay实现类是Display。在MANIFESTMF文件编辑器里选择Runtime在Exportedpackages里添加Idispaly接口所在的包在源码里添加如下一行:ServiceComponent:OSGIINFservicexml上述操作的意思为:此Bundle对外提供的服务包为cominfotechbprautodisplaydisplay,其说明文件为OSGIINFservicexml最后MANIFESTMF的内容如下:ManifestVersion:BundleManifestVersion:BundleName:AutodisplayPluginBundleSymbolicName:cominfotechbprautodisplayBundleVersion:BundleActivator:cominfotechbprautodisplayActivatorBundleVendor:INFOTECHImportPackage:orgosgiframeworkversion="",orgosgiservicecomponentversion=""ExportPackage:cominfotechbprautodisplaydisplayServiceComponent:OSGIINFservicexml简单说明:ImportPackage:指需要依赖的包ExportPackage:指对外暴露的接口包名ServiceComponent:指定提供服务的组件说明文件信息这样一个提供简单打印信息服务的Bundle就完成了!二、创建使用服务的OSGIBundle按第一部分所述~步创建一个新的Bundle工程在dependencies的ImportedPackages里面添加第一部分所创建的提供服务的bundle包生成准备调用服务的类AutoTallyTaskPro其中定义一个类型第一部分中定义的接口IDispay的变量display生成getter,setter另外写一个unSetDisplay方法用于释放display对象。最后文件内容如下:***Activatorjava*packagecominfotechbrpautotallyimportorgosgiframeworkBundleActivatorimportorgosgiframeworkBundleContextpublicclassActivatorimplementsBundleActivator{publicvoidstart(BundleContextcontext)throwsException{Systemoutprintln("自动记账程序启动")}publicvoidstop(BundleContextcontext)throwsException{Systemoutprintln("自动记账程序停止")}}***AutoTallyTaskProcjava*packagecominfotechbrpautotallyimportjavautilMapimportcominfotechbprautodisplaydisplayIDisplayimportorgosgiservicecomponentComponentContextpublicclassAutoTallyTaskProcimplementsIAutoTallyTaskProc{privateIDisplaydisplaypublicIDisplaygetDisplay(){returndisplay}publicvoidsetDisplay(IDisplaydispaly){Systemoutprintln("自动记账setDisplay")thisdisplay=dispaly}publicvoidunSetDisplay(IDisplaydispaly){Systemoutprintln("自动记账unSetDisplay")if(thisdisplay==dispaly){display=}}protectedvoidactivate(ComponentContextcontext){displaysetDescInfor("自动记账激活调用显示器")}publicvoiddeactivate(ComponentContextcontext){displaysetDescInfor("自动记账停止调用显示器")}}下面配置注入IDisplay接口对象:创建一个叫OSGIINF的目录下面创建一个名为componentsxml的文件内容如下:<xmlversion=""encoding=""><componentname="Autotally"><implementationclass="cominfotechbrpautotallyAutoTallyTaskProc"><referencename="Displayer"interface="cominfotechbprautodisplaydisplayIDisplay"bind="setDisplay"unbind="unSetDisplay"cardinality=""policy="dynamic"><component>在上面声明了这个组件的名称为Autotally实现类为cominfotechbrpautotallyAutoTallyTaskProc还指定了其中绑定服务的类型和绑定、解绑方法。在MANIFESTMF中添加:ServiceComponent:OSGIINFcomponentsxml最后MANIFESTMF的内容如下:ManifestVersion:BundleManifestVersion:BundleName:AutotallyPluginBundleSymbolicName:cominfotechbrpautotallyBundleVersion:BundleActivator:cominfotechbrpautotallyActivatorBundleVendor:INFOTECHImportPackage:cominfotechbprautodisplaydisplay,orgosgiframeworkversion="",orgosgiservicecomponentversion=""ServiceComponent:OSGIINFcomponentsxml运行后能看到组件的调用过程:输入ss查看组件运行情况如下图:输入stop然后输入stop如下图:至此一个完整的简单OSGI服务创建和调用实例已经全部展示完毕在往下的过程中我们将整合Spring和OSGI框架。三、对服务使用Spring接下来将服务Bundle放入Spring环境中处理首先下载SpringDynamicModulesforOSGi(tm)ServicePlatforms并安装如图:在Opendebugdialog的bundle中添加上面的包(第一、二部分所添加的包全部保留)。在项目下添加SPRINGINF目录下面添加一个名为springservicexml的文件如图内容如下:<xmlversion=""encoding=""><beansxmlns="http:wwwspringframeworkorgschemabeans"xmlns:xsi="http:wwwworgXMLSchemainstance"xmlns:osgi="http:wwwspringframeworkorgschemaosgi"xsi:schemaLocation="http:wwwspringframeworkorgschemabeanshttp:wwwspringframeworkorgschemabeansspringbeansxsdhttp:wwwspringframeworkorgschemaosgihttp:wwwspringframeworkorgschemaosgispringosgixsd"><beanid="AutoDisplay"class="cominfotechbprautodisplaydisplayDisplay"><bean><osgi:serviceid="SAutoDisplay"ref="AutoDisplay"interface="cominfotechbprautodisplaydisplayIDisplay"><osgi:service><beans>将MANIFESTMF的内容改成ManifestVersion:BundleManifestVersion:BundleName:AutodisplayPluginBundleSymbolicName:cominfotechbprautodisplayBundleVersion:BundleActivator:cominfotechbprautodisplayActivatorBundleVendor:INFOTECHImportPackage:orgosgiframeworkversion="",orgosgiservicecomponentversion=""ExportPackage:cominfotechbprautodisplaydisplaySpringContext:SPRINGINFspringservicexml注意和第一部分的MANIFESTMF内容对比会发现ServiceComponent被替换成了SpringContext这时再运行控制台打印信息如图:黑字部分显示出Bundle已经正常运行红字为Spring打印出的调试信息。注意:与第一、二部分的运行相比少了输出:“显示器激活”即Display类的Activate方法没有执行(随后说明)。输入ss查看Bundles运行状态后再停止之如下图:对比第一、二部分的运行效果可以发现在unSet之后没有“显示器卸载”的输出即其deactivate方法也没有执行(随后说明)。关于activate和deactivate不会自动执行笔者没有找到好的解决方法。但根据SpringDM的规范它并不推荐如此因为两个方法的声明用到ComponentContext换句话讲这将使你的代码和执行环境上下文绑定除非逼不得已并不支持这样做。笔者现在采用的方法是将服务调用者本身也定制为一个服务(但不需对外提供任何接口仅仅是注册一个服务)这样即可利用其registered和unregistered事件来实现activate和deactivate一样的功能。四、对服务调用者使用Spring同第三部分的、步骤只是xml文件内容为:<xmlversion=""encoding=""><beansxmlns="http:wwwspringframeworkorgschemabeans"xmlns:xsi="http:wwwworgXMLSchemainstance"xmlns:osgi="http:wwwspringframeworkorgschemaosgi"xsi:schemaLocation="http:wwwspringframeworkorgschemabeanshttp:wwwspringframeworkorgschemabeansspringbeansxsdhttp:wwwspringframeworkorgschemaosgihttp:wwwspringframeworkorgschemaosgispringosgixsd"><beanid="AutoTallyTaskProc"class="cominfotechbrpautotallyAutoTallyTaskProc"><bean><osgi:referenceid="ConfigControl"interface="cominfotechbprautodisplaydisplayIDisplay"><osgi:listenerref="AutoTallyTaskProc"bindmethod="onBind"unbindmethod="onUnbind"><osgi:listener><osgi:reference><osgi:serviceid="SAutoTally"ref="AutoTallyTaskProc"interface="cominfotechbrpautotallyIAutoTallyTaskProc"><registrationlistenerref="AutoTallyTaskProc"registrationmethod="serviceRegistered"unregistrationmethod="serviceUnregistered"><osgi:service><beans>简单说明如下:bean元素声明了一个id为AutoTallyTaskProc的beanosgi:reference元素声明了导入提供Idisplay接口的服务使用AutoTallyTaskProc作为其监听器在绑定和解绑服务时分别调用onBind和onUnbind方法。osgi:service元素声明了服务SautoTally提供接口为IautoTallyTaskProc(空接口)实现Bean为AutoTallyTaskProc。注册注销监听器也是AutoTallyTaskProc注册完毕执行:serviceRegistered注销完毕执行:serviceUnregistered。改造AutoTallyTaskProc的代码如下:packagecominfotechbrpautotallyimportjavautilMapimportcominfotechbprautodisplaydisplayIDisplaypublicclassAutoTallyTaskProcimplementsIAutoTallyTaskProc{privateIDisplaydisplaypublicIDisplaygetDisplay(){returndisplay}publicvoidsetDisplay(IDisplaydispaly){Systemoutprintln("自动记账setDisplay")thisdisplay=dispaly}publicvoidserviceRegistered(IAutoTallyTaskProcserviceInstance,MapserviceProperties){Systemoutprintln("自动记账服务注册完毕")displaysetDescInfor("Hello")}publicvoidserviceUnregistered(IAutoTallyTaskProcserviceInstance,MapserviceProperties){Systemoutprintln("自动记账服务注销完毕")}publicvoidonBind(IDisplaydisplay,MapargMap)throwsException{Systemoutprintln("绑定"displaygetClass()getName())thisdisplay=(IDisplay)display}publicvoidonUnBind(IDisplaydisplay,MapargMap)throwsException{Systemoutprintln("解绑"displaygetClass()getName())if(thisdisplay==display){display=}}}另外再写一个空的接口IautoTallyTaskProc代码略。注意:上面所述的定义方式和代码结构是笔者所推荐的从代码可以看出没有任何Spring和OSGi的API引用。最后的代码结构如下:执行时应按顺序打印启动、绑定服务调用服务的信息。OK!五、其他获取服务有多种方式若使用如下XML文件配置方式需要orgeclipseequinoxdsvjar的支持。在OSGIINFserverxml中说明:<xmlversion=""encoding=""><componentname="osgitestinvokers"><implementationclass="osgitestinvokers"><referencename="autotallytest"interface="osgitestautotallyILog"bind="setLogger"unbind="unSetLogger"cardinality=""policy="dynamic"><component>获取服务的第二种方法在start里:*importorgosgiframeworkServiceReferencesimpleLogServiceTracker=newServiceTracker(context,接口类classgetName(),)simpleLogServiceTrackeropen()simpleLogService=(接口类)simpleLogServiceTrackergetService()if(simpleLogService!=)simpleLogServicesetLogInfo("OSGI框架已经成功启动了一切运行正常")elseSystemoutprintln("没有获得服务")*获取服务第三种方法:ServiceReferenceserviceRef=contextgetServiceReference(接口类classgetName())Loggerlogger=(接口类)contextgetService(serviceRef)loggersetLogInfo("OSGI框架已经成功启动了一切运行正常")若使用后两种方法需要在Stop方法里卸载:ServiceReferenceserviceRef=contextgetServiceReference(接口类classgetName())*if(simpleLogService!=)simpleLogServicesetLogInfo("正在结束使用")simpleLogServiceTrackerclose()simpleLogServiceTracker=simpleLogService=*OSGI入门和整合Spring概述一、创建提供服务的OSGIBundle二、创建使用服务的OSGIBundle三、对服务使用Spring四、对服务调用者使用Spring五、其他

类似资料

该用户的其他资料

JasperReport+iReport报表工具详细开发手册 (1).pdf

iReport报表教材.pdf

报表工具JasperReport 的实现及应用.pdf

基于OSGi和Spring开发Web应用.doc

Introduce.OSGi.ppt

职业精品

精彩专题

结婚彩礼真有那么重要吗?

原创于西周而后沿袭至今的彩礼,虽然被一部分家长奉为圭臬,但越来越多的年轻人对结婚必须要彩礼不以为然。彩礼引发的社会矛盾越来越受到关注,结婚是自己的事,如人饮水冷暖自知,至于要不要彩礼或者要多少彩礼,因人而异,因财力而已,不可一概而论。

用户评论

0/200
    暂无评论
上传我的资料

精选资料

热门资料排行换一换

  • 商道.(韩)崔仁浩着.pdf

  • 现代物理学与东方神秘主义.pdf

  • MATLAB.ppt

  • 曾国藩语录.doc

  • XXX有限公司网站建设报价单.d…

  • 中国古代文学.doc

  • 地质规范汇总.pdf

  • 随机致富的傻瓜.pdf

  • 真诰校注.pdf

  • 资料评价:

    / 21
    所需积分:2 立即下载

    意见
    反馈

    返回
    顶部