??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲女人影院想要爱,久久久久久久综合日本亚洲 ,亚洲AV无码成人网站在线观看http://m.tkk7.com/benniaolk/category/44430.html梦瓜哇?/description>zh-cnSun, 28 Mar 2010 10:18:01 GMTSun, 28 Mar 2010 10:18:01 GMT60Spring DM的开发示?/title><link>http://m.tkk7.com/benniaolk/articles/316756.html</link><dc:creator>Dreava</dc:creator><author>Dreava</author><pubDate>Sun, 28 Mar 2010 09:36:00 GMT</pubDate><guid>http://m.tkk7.com/benniaolk/articles/316756.html</guid><wfw:comment>http://m.tkk7.com/benniaolk/comments/316756.html</wfw:comment><comments>http://m.tkk7.com/benniaolk/articles/316756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/benniaolk/comments/commentRss/316756.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/benniaolk/services/trackbacks/316756.html</trackback:ping><description><![CDATA[<p>        在读本文之前Q您应该对基于Equinox的开发有一定的了解Q如果您q不太清楚,请参?a class="postTitle2" id="homepage1_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl00_TitleUrl" href="http://m.tkk7.com/benniaolk/articles/316755.html">ZEquinox开发HelloWorld</a>一文?br />         <br />         本文讲到的例子是仿照|上甚ؓ行的一个例子,但苦于一直未扑ֈ源码Q网上脓的都是一些{帖,代码片段Q估计初学者很隑ְ其还原ƈ调通!我最开始弄q个咚咚的时候,其过E之痛苦Q难以言喻,所以想着仿照该例子的设计Q给予实玎ͼ文后贴出源码Q希望能帮到大家?br />         该例子是一个关于计器的实例,osgi.example.compute bundle(下文Ucompute bundle)提供了统一的计接口:ComputeQ另外两个bundle分别为osgi.example.compute.add(下文Uadd bundle)和osgi.example.compute.multiply(下文Umultiply bundle)Q在q两个bundle中,各自对compute bundleq行不同的实玎ͼ一个实现加法,一个实C法。另外还有一个服务消费者osgi.example.compute.consumer bundle(下文Uconsumer bundle)Qconsumer bundle负责消费add bundle和multiply bundle提供的服务。上q?个bundle之间的关pd下图所C:<br /> <img height="345" alt="" src="http://m.tkk7.com/images/blogjava_net/benniaolk/OSGi/Spring与OSGi的整?8.png" width="345" border="0" /></p> <p>        创徏4个bundle之后的工E目录如下图所C:</p> <p align="left"><img height="70" alt="" src="http://m.tkk7.com/images/blogjava_net/benniaolk/OSGi/Spring与OSGi的整?9.png" width="205" border="0" /><br />       通过该示例,演C如何利用Spring DM发布和调用OSGi服务Q同时还演COSGi的动态服务调用能力?br /> <br /> <strong>1.   bundle osgi.example.compute <br /> </strong>      compute bundle只提供一个接口——ComputeQ因此无需依赖更多的bundleQ只需最基本的osgi卛_。因Z涉及注册资源之类的,所以也无需Activator入口cR?br /> Computer接口源代码如下所C:</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> osgi.example.compute;   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />  <br /> <img id="Codehighlighter1_61_114_Open_Image" onclick="this.style.display='none'; Codehighlighter1_61_114_Open_Text.style.display='none'; Codehighlighter1_61_114_Closed_Image.style.display='inline'; Codehighlighter1_61_114_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_61_114_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_61_114_Closed_Text.style.display='none'; Codehighlighter1_61_114_Open_Image.style.display='inline'; Codehighlighter1_61_114_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">interface</span><span style="color: #000000"> Compute </span><span id="Codehighlighter1_61_114_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_61_114_Open_Text"><span style="color: #000000">{   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> String computeNums(</span><span style="color: #0000ff">int</span><span style="color: #000000"> x, </span><span style="color: #0000ff">int</span><span style="color: #000000"> y);   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000">  </span></div> <br /> <strong>2.    bundle osgi.example.compute.add<br /> </strong> <p>        add bundle是对compute bundle的具体服务实玎ͼ在MANIFEST.MF文g需要引入osgi.example.compute包;当然也可以通过d依赖bundle的Ş式,即不引入包,而直接在Required Plug-ins中添加compute bundle。如下图所C:</p> <img height="439" alt="" src="http://m.tkk7.com/images/blogjava_net/benniaolk/OSGi/Spring与OSGi的整?10.png" width="623" border="0" /><br /> <p style="margin: 0cm 0cm 0pt; text-align: left"><span style="font-size: small"></p> <div style="border-right: #666666 1px solid; border-top: #666666 1px solid; border-left: #666666 1px solid; width: 887px; border-bottom: #666666 1px solid; height: 1px"> <p style="margin: 0cm 0cm 0pt; text-align: left"><span style="font-size: small"><strong>注意Q?span style="color: #ff0000"><span style="font-family: Calibri">OSGi</span></span>官方指出Q当需要用到其?span style="color: #ff0000"><span style="font-family: Calibri">bundle</span></span>的类型时Q不提倡依?span style="color: #ff0000"><span style="font-family: Calibri">bundle</span></span>Q应该尽可能采用<span style="color: #ff0000"><span style="font-family: Calibri">Import-package</span></span>的方式引入包Q因Z?span style="color: #ff0000"><span style="font-family: Calibri">bundle</span></span>可能在加?span style="color: #ff0000"><span style="font-family: Calibri">bundle</span></span>的时候发生问题?/strong></span></p> </div> <br /> add bundle的工E结构如下图所C:<br /> <img height="225" alt="" src="http://m.tkk7.com/images/blogjava_net/benniaolk/OSGi/Spring与OSGi的整?11.png" width="323" border="0" /><br /> <p> </p> <p>       通过引入osgi.example.compute包,osgi.example.compute  bundle被加Cadd bundl的classpath当中Q解决了开发时期的cd识别问题?br /> q样一来,在add bundle中就能用compute bundle中的接口了,Computer接口的实现如下:</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> osgi.example.compute.add;   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />  <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> osgi.example.compute.Compute;   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />  <br /> <img id="Codehighlighter1_119_301_Open_Image" onclick="this.style.display='none'; Codehighlighter1_119_301_Open_Text.style.display='none'; Codehighlighter1_119_301_Closed_Image.style.display='inline'; Codehighlighter1_119_301_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_119_301_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_119_301_Closed_Text.style.display='none'; Codehighlighter1_119_301_Open_Image.style.display='inline'; Codehighlighter1_119_301_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> Add </span><span style="color: #0000ff">implements</span><span style="color: #000000"> Compute </span><span id="Codehighlighter1_119_301_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_119_301_Open_Text"><span style="color: #000000">{   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  <br /> <img id="Codehighlighter1_171_296_Open_Image" onclick="this.style.display='none'; Codehighlighter1_171_296_Open_Text.style.display='none'; Codehighlighter1_171_296_Closed_Image.style.display='inline'; Codehighlighter1_171_296_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_171_296_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_171_296_Closed_Text.style.display='none'; Codehighlighter1_171_296_Open_Image.style.display='inline'; Codehighlighter1_171_296_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> String computeNums(</span><span style="color: #0000ff">int</span><span style="color: #000000"> x, </span><span style="color: #0000ff">int</span><span style="color: #000000"> y) </span><span id="Codehighlighter1_171_296_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_171_296_Open_Text"><span style="color: #000000">{   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">int</span><span style="color: #000000"> s </span><span style="color: #000000">=</span><span style="color: #000000"> x </span><span style="color: #000000">+</span><span style="color: #000000"> y;   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        String result </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">The Sum is---</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> String.valueOf(s);   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">return</span><span style="color: #000000"> result;   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000">  </span></div> <p>        Compute的实现已l实CQ那么如何将其发布出dQ这个是由Spring DM负责QSpring DM利用OSGi命名I间下的<service>元素bean导出为OSGi服务。最单的形式为:<br /> </p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000"><</span><span style="color: #000000">beans:bean id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">beanToPublish</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.xyz.imp.MessageServiceImp</span><span style="color: #000000">"</span><span style="color: #000000">/></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000"><</span><span style="color: #000000">service ref</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">beanToPublish</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #0000ff">interface</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.xyz.MessageService</span><span style="color: #000000">"</span><span style="color: #000000">/></span><span style="color: #000000"> </span></div> <p>        从示例中可以看出QbeanToPublish被service元素声明导出?br /> 另外Qservicel点q有一些高U属性,如depends-on、context-class-loader、ranking{待Q详情请看spring dm reference?br />         首先Q需要在add bundle的工E根目录下的”META-INF”的文件夹下创Z个文件夹Q取?#8221;spring”QSpring DM能够自动解析该文件夹下所有的spring配置文g。spring配置文g的具体内容如下所C:</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000"><?</span><span style="color: #000000">xml version</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">1.0</span><span style="color: #000000">"</span><span style="color: #000000"> encoding</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">?></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000"><</span><span style="color: #000000">beans xmlns</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/beans</span><span style="color: #000000">"</span><span style="color: #000000">  <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />    xmlns:xsi</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.w3.org/2001/XMLSchema-instance</span><span style="color: #000000">"</span><span style="color: #000000">    <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />    xmlns:osgi</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/osgi</span><span style="color: #000000">"</span><span style="color: #000000">  <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />    xsi:schemaLocation</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/beans                         http://www.springframework.org/schema/beans/spring-beans.xsd   </span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000">                        http:</span><span style="color: #008000">//</span><span style="color: #008000">www.springframework.org/schema/osgi                          </span><span style="color: #008000; text-decoration: underline">http://www.springframework.org/schema/osgi/spring-osgi.xsd</span><span style="color: #008000">">   </span><span style="color: #008000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000">    </span><span style="color: #000000"><</span><span style="color: #000000">bean id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">addOsgiService</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">osgi.example.compute.add.Add</span><span style="color: #000000">"</span><span style="color: #000000">></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />    </span><span style="color: #000000"></</span><span style="color: #000000">bean</span><span style="color: #000000">></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />    </span><span style="color: #000000"><</span><span style="color: #000000">osgi:service id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">addService</span><span style="color: #000000">"</span><span style="color: #000000"> ref</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">addOsgiService</span><span style="color: #000000">"</span><span style="color: #000000">  <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #0000ff">interface</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">osgi.example.compute.Compute</span><span style="color: #000000">"</span><span style="color: #000000">></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />    </span><span style="color: #000000"></</span><span style="color: #000000">osgi:service</span><span style="color: #000000">></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000"></</span><span style="color: #000000">beans</span><span style="color: #000000">></span><span style="color: #000000">  </span></div>         如此一来,其他bundlep通过spring dm引入接口cd为osgi.example.compute.Compute的服务了Qspring dm通过一定的服务查找{略Q返回匹配的服务?br /> <br /> <strong>3.    bundle osgi.example.compute.multiply<br /> </strong> <p>该bundle和add bundle怼Q在q就不赘qC?br /> <strong>4.    bundle osgi.example.compute.client<br /> </strong></p> <p>        ֐思义Q该bundle作为add 、multiply两个bundle的客户bundleQ演C如何导入服务?br />         OSGi的测试工作比较麻烦,q方面还没研IӞ在这里利用spring实例化bean的时期,从构造函数入手,Ҏ务进行测试。Clientcȝ实现很简单,如下所C:</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> osgi.example.client;   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />  <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> osgi.example.compute.Compute;   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />  <br /> <img id="Codehighlighter1_98_305_Open_Image" onclick="this.style.display='none'; Codehighlighter1_98_305_Open_Text.style.display='none'; Codehighlighter1_98_305_Closed_Image.style.display='inline'; Codehighlighter1_98_305_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_98_305_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_98_305_Closed_Text.style.display='none'; Codehighlighter1_98_305_Open_Image.style.display='inline'; Codehighlighter1_98_305_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> Client </span><span id="Codehighlighter1_98_305_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_98_305_Open_Text"><span style="color: #000000">{   <br /> <img id="Codehighlighter1_107_195_Open_Image" onclick="this.style.display='none'; Codehighlighter1_107_195_Open_Text.style.display='none'; Codehighlighter1_107_195_Closed_Image.style.display='inline'; Codehighlighter1_107_195_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_107_195_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_107_195_Closed_Text.style.display='none'; Codehighlighter1_107_195_Open_Image.style.display='inline'; Codehighlighter1_107_195_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />    </span><span id="Codehighlighter1_107_195_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/** */</span><span id="Codehighlighter1_107_195_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">  <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />     * Z方便试Q采用Spring的构造注入方式,直接在构造函C调用Compute服务  <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />     * </span><span style="color: #808080">@param</span><span style="color: #008000"> compute  <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />     </span><span style="color: #008000">*/</span></span><span style="color: #000000">  <br /> <img id="Codehighlighter1_233_300_Open_Image" onclick="this.style.display='none'; Codehighlighter1_233_300_Open_Text.style.display='none'; Codehighlighter1_233_300_Closed_Image.style.display='inline'; Codehighlighter1_233_300_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_233_300_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_233_300_Closed_Text.style.display='none'; Codehighlighter1_233_300_Open_Image.style.display='inline'; Codehighlighter1_233_300_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> Client(Compute compute)</span><span id="Codehighlighter1_233_300_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_233_300_Open_Text"><span style="color: #000000">{   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        System.out.println(compute.computeNums(</span><span style="color: #000000">5</span><span style="color: #000000">, </span><span style="color: #000000">6</span><span style="color: #000000">));   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000">  </span></div> </span> <p>      另外Q因为client用到了其他几个bundle的类型,所以需要导入相应的包,步骤在上面已有讲到?br />       spring dm?lt;reference>元素来引入服务,最单的形式如下所C:</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000"><</span><span style="color: #000000">reference id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">beanToPublish</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #0000ff">interface</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.xyz.MessageService</span><span style="color: #000000">"</span><span style="color: #000000">/></span><span style="color: #000000">  </span></div> <p>      如果需要用到该服务Q如某个bean包含一个com.xyz.MessageService属性,则配|该bean如下所C:</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000"><</span><span style="color: #000000">bean id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">referenceBean</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.nci.ReferenceBean</span><span style="color: #000000">"</span><span style="color: #000000">></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />    </span><span style="color: #000000"><</span><span style="color: #000000">property name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">messageService</span><span style="color: #000000">"</span><span style="color: #000000"> ref</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">beanToPublish</span><span style="color: #000000">"</span><span style="color: #000000">/></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000"></</span><span style="color: #000000">bean</span><span style="color: #000000">></span><span style="color: #000000">  </span></div>       reference元素q有一些高U属性,详情误spring dm reference?br />      看一下client的spring配置文gQ?br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000"><?</span><span style="color: #000000">xml version</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">1.0</span><span style="color: #000000">"</span><span style="color: #000000"> encoding</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">?></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000"><</span><span style="color: #000000">beans xmlns</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/beans</span><span style="color: #000000">"</span><span style="color: #000000">  <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />    xmlns:xsi</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.w3.org/2001/XMLSchema-instance</span><span style="color: #000000">"</span><span style="color: #000000"> xmlns:osgi</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/osgi</span><span style="color: #000000">"</span><span style="color: #000000">  <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />    xsi:schemaLocation</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd   </span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000">                      http:</span><span style="color: #008000">//</span><span style="color: #008000">www.springframework.org/schema/osgi </span><span style="color: #008000; text-decoration: underline">http://www.springframework.org/schema/osgi/spring-osgi.xsd</span><span style="color: #008000">">   </span><span style="color: #008000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000">  <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />    </span><span style="color: #000000"><</span><span style="color: #000000">bean id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">OSGiClient</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">osgi.example.client.Client</span><span style="color: #000000">"</span><span style="color: #000000">></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #000000"><</span><span style="color: #000000">constructor</span><span style="color: #000000">-</span><span style="color: #000000">arg ref</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">ComputeService</span><span style="color: #000000">"</span><span style="color: #000000">></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #000000"></</span><span style="color: #000000">constructor</span><span style="color: #000000">-</span><span style="color: #000000">arg</span><span style="color: #000000">></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />                </span><span style="color: #000000"></</span><span style="color: #000000">bean</span><span style="color: #000000">></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />                </span><span style="color: #000000"><</span><span style="color: #000000">osgi:reference id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">ComputeService</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #0000ff">interface</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">osgi.example.compute.Compute</span><span style="color: #000000">"</span><span style="color: #000000"> cardinality</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">1..1</span><span style="color: #000000">"</span><span style="color: #000000">></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />                </span><span style="color: #000000"></</span><span style="color: #000000">osgi:reference</span><span style="color: #000000">></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000"></</span><span style="color: #000000">beans</span><span style="color: #000000">></span><span style="color: #000000">   </span></div>        从上面的CZQ我们可以发玎ͼ服务的导出的时候都是基于接口的Q服务的引用也是Z接口的,不过spring dm支持Zcȝ导出、导入,但是q是量Z接口Q应该记住面向接口编E的思想Q以应对来有可能发生的改变?br /> <br /> <strong>5.    q行<br /> </strong>      ׃add和multiply都是ZCompute接口对外导出服务Q那么Client到底导入的是哪个服务呢?默认情况下,会导入启动较早的bundle服务QOSGi在bundle启动Ӟ会ؓ其分配一个ID|启动早Q该D)?br />       q行之前Q我们需要做q么一件事Q在window->preferences->plug-in development->Target Platform面板中,Target指定为Spring DM…Q如下图所C:<br /> <img height="597" alt="" src="http://m.tkk7.com/images/blogjava_net/benniaolk/OSGi/Spring与OSGi的整?12.png" width="1007" border="0" /><br />         之后可以配|运行了Q随便在一个bundle工程上右键,Run As->Run ConfigurationsQ新Z个OSGi Platformq行(右键OSGi Platform卛_Q,如下图所C:<br /> <img height="652" alt="" src="http://m.tkk7.com/images/blogjava_net/benniaolk/OSGi/Spring与OSGi的整?13.png" width="958" border="0" /><br /> <p>       需要勾选中spring bundle版(2.5.6Q,spring dm的几个核心包Qcore、extender、io再点validate bundles按钮Q校验是否已全部选中其依赖的bundle。然后即可点击运行了?br />        q行之后Q我们发现控制台输出l果Q?br /> The Sum is---11<br /> 通过ss命oQ如下:<br /> 5 ACTIVE      osgi.example.compute.multiply_1.0.0<br /> 6 ACTIVE      osgi.example.compute.add_1.0.0<br /> 7 ACTIVE      osgi.example.compute.client_1.0.0<br /> ?停掉:stop 6<br /> 然后再refresh 7Q控制台输出如下l果Q?br /> The Multiply is---30<br /> 通过 ss 命oQ如下:<br /> 5 ACTIVE      osgi.example.compute.multiply_1.0.0<br /> 6 RESOLVED    osgi.example.compute.add_1.0.0<br /> 7 ACTIVE      osgi.example.compute.client_1.0.0<br /> 现在multiply处于q行状态,而add已经被停止,所以client导入的服务实际是由multiply提供的?br /> </p> <p><strong>6. ȝ</strong> </p> <p>       通过该文档,我们已经清楚了,如何使用Spring DM导出、导入服务。Spring DM的一些高U特性请查阅spring dm reference?br /> <br /> <br /> <strong><em>附gQ?a href="/Files/benniaolk/OSGi/Spring与OSGi的整?1.rar">osgi.example.compute.rar</a></em></strong><br /> </p> <img src ="http://m.tkk7.com/benniaolk/aggbug/316756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/benniaolk/" target="_blank">Dreava</a> 2010-03-28 17:36 <a href="http://m.tkk7.com/benniaolk/articles/316756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ZEquinox开发HelloWorldhttp://m.tkk7.com/benniaolk/articles/316755.htmlDreavaDreavaSun, 28 Mar 2010 08:58:00 GMThttp://m.tkk7.com/benniaolk/articles/316755.htmlhttp://m.tkk7.com/benniaolk/comments/316755.htmlhttp://m.tkk7.com/benniaolk/articles/316755.html#Feedback0http://m.tkk7.com/benniaolk/comments/commentRss/316755.htmlhttp://m.tkk7.com/benniaolk/services/trackbacks/316755.html1. 开发环境的准备

        现在的eclipse都已l包含了EquinoxQ无需单独下蝲?br /> 2. 开发OSGi的HelloWorld应用E序

       在这一节,我们开发一个OSGi bundleQ演C如何利用Equinoxq行OSGi bundle的开发、运行及调试Qؓ之后的示例做准备?br />        首先Q新Z个Plug-in工程Q如下图所C:

下一步,注意选择目标q_Q默认ؓEclipse version *Q将其改成EquinoxQ如下图所C:


之后按默认下一步即可,到最后一步时Q无需Ҏ模板创徏工程Q去掉默认的勾,如下图:


点击完成Q创建的工程目录如下图所C:


从图中,可以看到Qeclipse为工E自动生成了一个Activatorc,如下所C:
package helloworld;   
  
import org.osgi.framework.BundleActivator;   
import org.osgi.framework.BundleContext;   
  
public class Activator implements BundleActivator {   
  
    
/*  
     * (non-Javadoc)  
     * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)  
     
*/
  
    
public void start(BundleContext context) throws Exception {   
        System.out.println(
"Hello World!");   
    }
   
  
    
/*  
     * (non-Javadoc)  
     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)  
     
*/
  
    
public void stop(BundleContext context) throws Exception {   
    }
   
  
}
  
        有过eclipse插g开发经验的人应该很快就能明白,q就是该工程——实际上是上一文章中所U的bundle在Equinoxq_中的启动入口Q相当于我们的熟悉的main函数Q如果将该bundleq行到Equinox中,首先q入该bundle的是Activator的startҎQ你可以相关的服务、资源在该方法内完成向bundleContext的注册——文章后面会具体讲到相关内容。在q行期,如果惌该bundle停止q行QEquinoxq_调用Activator的stopҎQ你可以在该Ҏ内完成资源的注销{工作?br />         下面我们要完成首次的Equinoxq行Q将向大家展现bundle到底是如何运行v来的。ؓhelloworld选择q行方式Q如下图所C:

        弹出如下对话框:

        在弹出的对话框中Q新Z个OSGi Frameworkq行环境Q双击OSGi Framework卛_Q这里ؓ其取名EquinoxQ,选中helloworld(1.0.0)Q然后点d边的Add Required Bundles按钮Qeclipse自动选中q行helloworld的依赖bundleQ如果有必要Q可以点d下的Validate Bundles验证按钮Q验证程序正常运行所需的bundle是否都被选中Q最后点击运行,回到控制収ͼ
osgi> Hello World!
        可以看到Q之前在Activator的startҎ中的输出语句已经被输出到控制収ͼ我们可以通过命oss查看Equinox的运行情况,可以看到一p行了两个bundleQ如下:
ss

Framework is launched.

id State       Bundle
0 ACTIVE      org.eclipse.osgi_3.4.3.R34x_v20081215-1030
1 ACTIVE      helloworld_1.0.0

        q记得之前讲到过的bundle的几U状态吧Qhelloworld已经q行h了?br />         那么Equinox具体支持哪些命o呢?下表列出了主要的一些命令,如需查看更详l的命o清单Q则可以在控制台键入help?/p>

cd

命o

含义

控制框架

launch

启动框架

shutdown

停止框架

close

关闭、退出框?/p>

exit

立即退出,相当?System.exit

init

卸蝲所?bundleQ前提是已经 shutdownQ?/p>

setprop

讄属性,在运行时q行

控制 bundle

install

安装

uninstall

卸蝲

start

启动

stop

停止

refresh

h

update

更新

展示状?/strong>

status

展示安装?bundle 和注册的服务

ss

展示所?bundle 的简单状?/p>

services

展示注册服务的详l信?/p>

packages

展示导入、导出包的状?/p>

bundles

展示所有已l安装的 bundles 的状?/p>

headers

展示 bundles 的头信息Q即 MANIFEST.MF 中的内容

log

展示 LOG 入口信息

其它

exec

在另外一个进E中执行一个命令(d状态)

fork

?EXEC 不同的是不会引vd

gc

促垃圾回收

getprop

得到属性,或者某个属?/p>

控制启动U别

sl

得到某个 bundle 或者整个框架的 start level 信息

setfwsl

讄框架?start level

setbsl

讄 bundle ?start level

setibsl

讄初始?bundle ?start level

        xQ我们已l成功的演示了helloworldQ初步了解了OSGi的bundle是如何开发ƈq行的?br />



Dreava 2010-03-28 16:58 发表评论
]]>
OSGi和构件化开?/title><link>http://m.tkk7.com/benniaolk/articles/316738.html</link><dc:creator>Dreava</dc:creator><author>Dreava</author><pubDate>Sun, 28 Mar 2010 03:49:00 GMT</pubDate><guid>http://m.tkk7.com/benniaolk/articles/316738.html</guid><wfw:comment>http://m.tkk7.com/benniaolk/comments/316738.html</wfw:comment><comments>http://m.tkk7.com/benniaolk/articles/316738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/benniaolk/comments/commentRss/316738.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/benniaolk/services/trackbacks/316738.html</trackback:ping><description><![CDATA[<p>  </p> <p style="text-indent: 24pt"><span style="font-family: 宋体">目前Q关?/span>OSGi<span style="font-family: 宋体">的h变得来多Q?/span>OSGi<span style="font-family: 宋体">本n也早已从那个专注于嵌入式q_?#8220;?#8221;角色转变q来了,慢慢向企业应用市场渗透?/span></p> <p style="text-indent: 24pt"><span style="font-family: 宋体">从某U角度说Q?/span>Eclipse<span style="font-family: 宋体">可以说是</span>OSGi<span style="font-family: 宋体">在企业应用领域的试金矻I</span>2003<span style="font-family: 宋体">q?/span>Eclipse3.0<span style="font-family: 宋体">做了一ơ架构上的调_l箋延用插g的架构思想Q但是从</span>3.0<span style="font-family: 宋体">版之后,是基?/span>OSGi<span style="font-family: 宋体">的实现。也是q一ơ的调整Q推动了</span>Eclipse<span style="font-family: 宋体">的迅猛发展?/span></p> <p style="text-indent: 24pt"><span style="font-family: 宋体">q是在桌面应用的成功CZQ?/span>OSGi<span style="font-family: 宋体">的目标远不止于此Q以其优U的类加蝲机制Q可以说Q只需对其q行扩展Q那么就可以目标瞄准M一个领域。谈C业应用,无可避免的要涉及</span>Web<span style="font-family: 宋体">应用Q相信大多数人都在从事该领域的开发?/span>OSGi R4<span style="font-family: 宋体">版已明确提出了对</span>Web<span style="font-family: 宋体">的支持方式——当Ӟq种方式q是很有限的Q这一点将在后面的文章中详l说明?/span></p> <p style="text-indent: 24pt"><span style="font-family: 宋体">鉴于此,很多开源框枉已经或正准备发布支持</span>OSGi<span style="font-family: 宋体">的版本,比如</span>Spring DM<span style="font-family: 宋体">?/span>Struts1.8.1<span style="font-family: 宋体">?/span>CXF<span style="font-family: 宋体">{等Q基本上日常所用的开源框枉发布了基?/span>OSGi<span style="font-family: 宋体">版本。另外,有不应用服务器也已l基?/span>OSGi<span style="font-family: 宋体">q行实现Q比?/span>WAS<span style="font-family: 宋体">?/span>6.1<span style="font-family: 宋体">版就已经是基?/span>OSGi<span style="font-family: 宋体">的实玎ͼ?/span>Spring<span style="font-family: 宋体">也在</span>2009<span style="font-family: 宋体">q推Z</span>Spring DM Server<span style="font-family: 宋体">Q可?/span>OSGi<span style="font-family: 宋体">的吸引力q是很大的?/span></p> <p style="text-indent: 24pt"><span style="font-family: 宋体">那么q一切将会ؓ以后的开发带来什么媄响呢Q本文试图从</span>OSGi<span style="font-family: 宋体">和构件化开发的角度认识一下该问题?/span></p> <p style="text-indent: 24pt">OSGi<span style="font-family: 宋体">的类加蝲机制非常优秀Qؓ每个q行于其中的</span>bundle<span style="font-family: 宋体">创徏了独立的cd载器环境Q而运行于同一?/span>OSGi<span style="font-family: 宋体">框架内部?/span>bundle<span style="font-family: 宋体">之间不像</span>Web<span style="font-family: 宋体">服务器中?/span>Web<span style="font-family: 宋体">应用那样l缘Q它们之间是可以q行包依赖的Q当?/span>OSGi<span style="font-family: 宋体">也提供了服务注册{相xӞ保</span>bundle<span style="font-family: 宋体">之间的相互协作能力。而且</span>OSGi<span style="font-family: 宋体">支持</span>bundle<span style="font-family: 宋体">动态部|Ӏ所以,pȝ无需停机重启Q就可以实现其内部的动态更新?/span></p> <p style="text-indent: 24pt"><span style="font-family: 宋体">构g化开发的概念已经提了很多q了Q似乎一直缺乏一U有效的机制对其q行支持。构件化开发ؓpȝ开发带来了很多好处Q整个系l的开发可以按照模块的方式q行划分Q从而按模块q行开发;pȝ由各模块之间D而成Q通过代码一U的依赖或者服务依赖的方式Q对于某个模块进行更斎ͼ只要保持接口不变Q则可以实现对外界无影响?/span></p> <p style="text-indent: 24pt"><span style="font-family: 宋体">׃~Z有效的底层支持,构g化开发方式一直没有推行v来。由其对?/span>Web<span style="font-family: 宋体">应用而言Q想要实现构件化开发,g更是无从谈v?/span></p> <p style="text-indent: 24pt">OSGi<span style="font-family: 宋体">的出玎ͼ让这一事情有所转机。传l的</span>Web<span style="font-family: 宋体">应用开发过E中Q可能大多数人的做法是一个大?/span>Web<span style="font-family: 宋体">应用按功能模块进行划分,通过包切分来实现模块化开发,但是各模块之间ƈ没有从物理上隔离Q只是以一U组l方式上的约束,使其从表面看上去是分ȝ。对于这U方式,动态更新某个模块也无从谈起了?/span></p> <p style="text-indent: 24pt"><span style="font-family: 宋体">而如果将</span>OSGi<span style="font-family: 宋体">引入</span>Web<span style="font-family: 宋体">应用Q每个模块都对应于一?/span>bundle<span style="font-family: 宋体">Q那么模块与模块之间则从物理上进行了隔离Q能有效的将模块内部实现对外隐藏。模块之间的交互Q可以通过接口的导Z引用来实玎ͼ对于未经导出的部分,对于其他模块是不可见的。另外,׃</span>OSGi<span style="font-family: 宋体">支持</span>bundle<span style="font-family: 宋体">的热部vQ那意味着Q在当前</span>Web<span style="font-family: 宋体">应用未停机的情况下,可以Ҏ个或某些模块Q对?/span>OSGi<span style="font-family: 宋体">中的</span>bundle<span style="font-family: 宋体">Q进行动态更斎ͼ而不影响整个应用的正常运行?/span></p> <p style="text-indent: 24pt"><span style="font-family: 宋体">q种从物理上的有效隔ȝ方式Qؓ重用带来了新的方式。以前代码一U的重用Q一般都通过</span>Jar<span style="font-family: 宋体">包的形式q行Q而这U方式存在上q的一些缺点,卛_装性不够。而通过Z</span>OSGi<span style="font-family: 宋体">?/span>bundle<span style="font-family: 宋体">的Ş式,则可以有效隐藏内部实玎ͼ从包一U进行隐藏(q一点个得可以作?/span>Java<span style="font-family: 宋体">装性的一U扩展,以前的封装只能做到类一U,不知道未来是否会?/span>Java<span style="font-family: 宋体">规范吸收Q?/span></p> <p style="text-indent: 24pt"><span style="font-family: 宋体">p一点而言Q?/span>OSGi<span style="font-family: 宋体">Ҏ件化开发进行了很好的支持,当然</span>OSGi<span style="font-family: 宋体">q不为此而生?/span></p> <p style="text-indent: 24pt"><span style="font-family: 宋体">以上所说的构g依赖都是Z</span>API<span style="font-family: 宋体">一U的Q那么当Ӟ我们也可以将</span>Web Service<span style="font-family: 宋体">{类型服务封装至构g当中Q再l合</span>ESB<span style="font-family: 宋体">Q是不是?/span>SOA<span style="font-family: 宋体">的一U更好实现呢Q?/span>ESB<span style="font-family: 宋体">的关注点在于服务Q这是一U细_度的,它ƈ不考虑服务的封装、重用等斚w——这些方面都p计h员去把握。而结?/span>OSGi<span style="font-family: 宋体">Q当然还需要其他设施的支持Q比?/span>CXF<span style="font-family: 宋体">已经发布了基?/span>OSGi<span style="font-family: 宋体">的实玎ͼ可以服务封装至一?/span>bundle<span style="font-family: 宋体">Q以</span>bundle<span style="font-family: 宋体">为单元,向外界提供服务,q种服务卛_成了一U粗_度的——构件的特点之一?/span></p> <p style="text-indent: 24pt"><span style="font-family: 宋体">lg所qͼ我相信,</span>OSGi<span style="font-family: 宋体">的发展,会为构件化的开发方式带来福韟?/span></p> <p style="text-indent: 24pt"><span style="font-family: 宋体">引出话题Q?/span>OSGi<span style="font-family: 宋体">?/span>SCA<span style="font-family: 宋体">在很多方面有着异曲同工q妙Qƈ?/span>SCA<span style="font-family: 宋体">的实现框架—?/span>Tuscany<span style="font-family: 宋体">也对</span>OSGi<span style="font-family: 宋体">做了支持。这两者有互补Ҏ,有时间将对这两者做一个对比研I?/span></p> <img src ="http://m.tkk7.com/benniaolk/aggbug/316738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/benniaolk/" target="_blank">Dreava</a> 2010-03-28 11:49 <a href="http://m.tkk7.com/benniaolk/articles/316738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSGi初识http://m.tkk7.com/benniaolk/articles/316739.htmlDreavaDreavaSun, 28 Mar 2010 03:47:00 GMThttp://m.tkk7.com/benniaolk/articles/316739.htmlhttp://m.tkk7.com/benniaolk/comments/316739.htmlhttp://m.tkk7.com/benniaolk/articles/316739.html#Feedback0http://m.tkk7.com/benniaolk/comments/commentRss/316739.htmlhttp://m.tkk7.com/benniaolk/services/trackbacks/316739.htmlOSGi诞生初期Q其目的主要是能够灵zL便ƈq程理互联的网l嵌入设备,OSGi联盟上对?/span>OSGi service platform有这样一句解释:The OSGi service platform delivers an open, common architecture for service providers, developers, software vendors, gateway operators and equipment vendors to develop, deploy and manage services in a coordinated fashion.Q?/span>OSGi service platform是一个开攑ƈ且提供通用接口标准的体pLӞZq个体系框架Q服务提供商Q程序开发h员,软g提供商,服务|管q营商,讑֤提供商能够协调地联合h开发,部v以及理向用h供的各种服务Q。随着OSGi的发展,逐渐被引入到企业应用领域?/span>

目前Q?/span>OSGi规范的最新版本ؓR4.2Q有兌规范的详l情况请阅读OSGi实战的第7节—?a href="/Files/benniaolk/OSGi/OSGi初识/1.pdf">深入OSGi?/span>OSGi框架主要分ؓ四部分:q行环境Q?/span>executionenvironmentQ、模块(ModulesQ、生命周期管理(Life CycleQ、服务注册(Service RegistryQ。运行在OSGi环境中的是一个个?/span>BundleQ也是Modules的具体实现?/span>

对于每个bundleQ都有各自的ClassLoaderQ在q一点上和传l的Web应用有相g处,在传l的Web应用开发完成之后,都会其部v?/span>Tomcat?/span>Jboss{服务器上,q些Web应用都有着各自?/span>ClassLoader环境Q而两者之间的区别在于Q传l的Web应用无法做到资源的共享,因ؓ它们是完全独立、隔ȝ?/span>OSGi框架?/span>bundle之间的协作提供了底层支持Q通过?/span>bundle?/span>MANIFEST.MF文g?/span>Import-Package?/span>Export-Package{项Q?/span>bundle之间p怺׃n资源及服务,在以后的博文中,我将l出一个具体的CZ?/span>

׃OSGih良好的模块化l构Q我个h认ؓq将为将来的软g开发方式带来很大的冲击Q将更进一步推q模块化开发。目?/span>Web应用的开发一般采?/span>SSH框架Q将整个应用大致分ؓWebQ负责前台展玎ͼ?/span>ServiceQ负责业务逻辑处理Q?/span>DAOQ负责数据持久化Q?/span>DomainQ全局实体c)几个模块Q而发布的时候,被一h?/span>WAR包,部vx务器上。如果采?/span>bundle的Ş式,每个模块可以做ؓ独立?/span>bundleq行开发和部vQ?/span>bundle之间的协作可以通过上述的方式进行,而这样带来的好处是Q一旦需要对某个模块q行更改Q在保证依赖接口不变的前提下Q就可以单独更改相应?/span>bundleQ再q行热部|即可,q样一来,好处是显而易见的Q有效的分离了各个模块,减少了维护成本?/span>

׃采用bundle的Ş式,也增Z模块的复用性。这也是得益?/span>OSGi良好的模块化方式?/span>

另外一个很重要的点是OSGi具备热拔插特性,bundle的安装、启动、停止、卸载都可以在运行时指定Qƈ且可以随时更攏V这样一来,我们可以做到无需重启整个应用Q而只寚w要更改的部分q行升或打补丁卛_?/span>Bundl的状态图转换如下图所C:


?/span> 1 OSGi bundle状态{换图

以上?/span>OSGi的一些基本的Q但也是很重要的东西大概介绍了一下,在以后的博文中逐步深入吧。以上都是关?/span>OSGi原理性的东西Q那么实现该规范的有哪些产品呢?最有名的应该要?/span>Eclipse?/span>Equinox框架了,在网上查资料见有q,Eclipse3.0的那一ơ升U把自n的构架做了一ơ非常大的调_其主要原因就是采用了OSGi框架Q更好的支持?/span>Eclipse的插件体pR另外还?/span>Felix?/span>knopflerfish{?/span>

不过话说回来Q尽?/span>OSGi有很多好处,但是现在主要q是应用在服务器端,如现在的应用服务器基本上都采?/span>OSGi的框Ӟ而真正的应用市场仍处理v步阶D,q和OSGi的生态环境还不成熟,可喜的是Spring推出了其Spring DM?/span>SpringSource DM ServerQ前者能够很方便发布和引用服务,q且?/span>Spring Frameworkq_相融合,?/span>OSGi?/span>bundle context?/span>Spring applicationContext融合在一P大大方便?/span>OSGi的应用。后者是OSGi bundle的运行环境,是一个将Equinox?/span>Tomcat融合在一L服务器。在以后的博文中详l介l这些内宏V?/span>



Dreava 2010-03-28 11:47 发表评论
]]>
վ֩ģ壺 պǧ| պĻƵ| Ƶһ| պĻһ| 123Ʒ| ޸һ| ޳AVƬ߳ˮ| ҹdj߹ۿ| Ʒɫʹ| ձaƬѿ| Ůվ| ͵ۺ| ޹˾þۺһ| ޾Ʒ| ޾ƷA߹ۿ| ŷŷɫ| ĻӰԺ| 2022ѹƷ| Ӱȷѹۿ| վɫƵѹۿ45| ޾Ʒ| С˵ɫͼ| þĻƷһ| ޾Ʒ| ༤ۺ͵ͼ| һĻר| ۺAVһҳ| ŷһëƬ| þþþ޾ƷС˵| һëƬѿ| þþþAVר| avƬ| ɫav| ձվ| 㽶Ƶ| ޾Ʒ߹ۿ| ֻˬƵѿ| 182tvƵ·һ| ձŷɫƵ߲| avպav| ڵƵ|