ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>国产一区视频在线观看免费,欧美5-7sexvideos处,日韩在线亚洲http://www.aygfsteel.com/benniaolk/梦å‰ò瓜哇å›?/description>zh-cnSun, 22 Jun 2025 21:14:05 GMTSun, 22 Jun 2025 21:14:05 GMT60Spring DM的开发示ä¾?/title><link>http://www.aygfsteel.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://www.aygfsteel.com/benniaolk/articles/316756.html</guid><wfw:comment>http://www.aygfsteel.com/benniaolk/comments/316756.html</wfw:comment><comments>http://www.aygfsteel.com/benniaolk/articles/316756.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.aygfsteel.com/benniaolk/comments/commentRss/316756.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.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://www.aygfsteel.com/benniaolk/articles/316755.html">åŸÞZºŽEquinox开发HelloWorld</a>一文ã€?br />         <br />         æœ¬æ–‡è®²åˆ°çš„例子是仿照¾|‘ä¸Šç”šäØ“‹¹è¡Œçš„一个例子,但苦于一直未扑ֈ°æºç åQŒç½‘上脓的都是一些è{帖,代码片段åQŒä¼°è®¡åˆå­¦è€…很隑ְ†å…¶è¿˜åŽŸåÆˆè°ƒé€šï¼æˆ‘æœ€å¼€å§‹å¼„˜q™ä¸ªå’šå’šçš„æ—¶å€™ï¼Œå…¶è¿‡½E‹ä¹‹ç—›è‹¦åQŒéš¾ä»¥è¨€å–»ï¼Œæ‰€ä»¥æƒ³ç€ä»¿ç…§è¯¥ä¾‹å­çš„设计åQŒç»™äºˆå®žçŽŽÍ¼Œæ–‡åŽè´´å‡ºæºç åQŒå¸Œæœ›èƒ½å¸®åˆ°å¤§å®¶ã€?br />         è¯¥ä¾‹å­æ˜¯ä¸€ä¸ªå…³äºŽè®¡½Ž—器的实例,osgi.example.compute bundle(下文½Ž€¿U°compute bundle)提供了统一的计½Ž—接口:ComputeåQŒå¦å¤–两个bundle分别为osgi.example.compute.add(下文½Ž€¿U°add bundle)å’Œosgi.example.compute.multiply(下文½Ž€¿U°multiply bundle)åQŒåœ¨˜q™ä¸¤ä¸ªbundle中,各自对compute bundle˜q›è¡Œä¸åŒçš„实玎ͼŒä¸€ä¸ªå®žçŽ°åŠ æ³•ï¼Œä¸€ä¸ªå®žçŽîC¹˜æ³•。另外还有一个服务消费者osgi.example.compute.consumer bundle(下文½Ž€¿U°consumer bundle)åQŒconsumer bundle负责消费add bundleå’Œmultiply bundle提供的服务。上˜q?个bundle之间的关¾pÕd¦‚下图所½Cºï¼š<br /> <img height="345" alt="" src="http://www.aygfsteel.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://www.aygfsteel.com/images/blogjava_net/benniaolk/OSGi/Spring与OSGi的整å?9.png" width="205" border="0" /><br />       é€šè¿‡è¯¥ç¤ºä¾‹ï¼Œž®†æ¼”½Cºå¦‚何利用Spring DM发布和调用OSGi服务åQŒåŒæ—¶è¿˜ž®†æ¼”½CºOSGi的动态服务调用能力ã€?br /> <br /> <strong>1.   bundle osgi.example.compute <br /> </strong>      compute bundle只提供一个接口——ComputeåQŒå› æ­¤æ— éœ€ä¾èµ–更多的bundleåQŒåªéœ€æœ€åŸºæœ¬çš„osgi卛_¯ã€‚å› ä¸ÞZ¸æ¶‰åŠæ³¨å†Œèµ„源之类的,所以也无需Activator入口¾c…R€?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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_61_114_Open_Text"><span style="color: #000000">{   <br /> <img src="http://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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被加åˆîCº†add bundlçš„classpath当中åQŒè§£å†³äº†å¼€å‘时期的¾cÕdž‹è¯†åˆ«é—®é¢˜ã€?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://www.aygfsteel.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://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />  <br /> <img src="http://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_119_301_Open_Text"><span style="color: #000000">{   <br /> <img src="http://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_171_296_Open_Text"><span style="color: #000000">{   <br /> <img src="http://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">return</span><span style="color: #000000"> result;   <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000">   <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000">  </span></div> <p>        Compute的实现已¾lå®žçŽîCº†åQŒé‚£ä¹ˆå¦‚何将其发布出åŽÕd‘¢åQŸè¿™ä¸ªæ˜¯ç”±Spring DMè´Ÿè´£åQŒSpring 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://www.aygfsteel.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://www.aygfsteel.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>        从示例中可以看出åQŒbeanToPublish被service元素声明导出ã€?br /> 另外åQŒservice¾l“点˜q˜æœ‰ä¸€äº›é«˜¾U§å±žæ€§ï¼Œå¦‚depends-on、context-class-loader、ranking½{‰å¾…åQŒè¯¦æƒ…请看spring dm referenceã€?br />         首先åQŒéœ€è¦åœ¨add bundle的工½E‹æ ¹ç›®å½•下的”META-INF”的文件夹下创å»ÞZ¸€ä¸ªæ–‡ä»¶å¤¹åQŒå–å?#8221;spring”åQŒSpring 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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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>         如此一来,其他bundlež®Þpƒ½é€šè¿‡spring dm引入接口¾cÕdž‹ä¸ºosgi.example.compute.Compute的服务了åQŒspring dmž®†é€šè¿‡ä¸€å®šçš„æœåŠ¡æŸ¥æ‰¾½{–ç•¥åQŒè¿”回匹配的服务ã€?br /> <br /> <strong>3.    bundle osgi.example.compute.multiply<br /> </strong> <p>该bundleå’Œadd bundleç›æ€¼¼åQŒåœ¨˜q™å°±ä¸èµ˜˜qîCº†ã€?br /> <strong>4.    bundle osgi.example.compute.client<br /> </strong></p> <p>        ™å‘֐æ€ä¹‰åQŒè¯¥bundlež®†ä½œä¸ºadd 、multiply两个bundle的客户bundleåQŒæ¼”½Cºå¦‚何导入服务ã€?br />         OSGi的测试工作比较麻烦,˜q™æ–¹é¢è¿˜æ²¡ç ”½IÓž¼Œåœ¨è¿™é‡Œåˆ©ç”¨spring实例化bean的时期,从构造函数入手,å¯ÒŽœåŠ¡è¿›è¡Œæµ‹è¯•ã€‚Client¾cȝš„实现很简单,如下所½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://www.aygfsteel.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://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />  <br /> <img src="http://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />     * ä¸ÞZº†æ–¹ä¾¿‹¹‹è¯•åQŒé‡‡ç”¨Spring的构造注入方式,直接在构造函æ•îC¸­è°ƒç”¨Compute服务  <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />     * </span><span style="color: #808080">@param</span><span style="color: #008000"> compute  <br /> <img src="http://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_233_300_Open_Text"><span style="color: #000000">{   <br /> <img src="http://www.aygfsteel.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://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000">   <br /> <img src="http://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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配置文äšgåQ?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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #000000">  <br /> <img src="http://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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://www.aygfsteel.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>        从上面的½CÞZ¾‹åQŒæˆ‘们可以发玎ͼŒæœåŠ¡çš„å¯¼å‡ºçš„æ—¶å€™éƒ½æ˜¯åŸºäºŽæŽ¥å£çš„åQŒæœåŠ¡çš„å¼•ç”¨ä¹Ÿæ˜¯åŸÞZºŽæŽ¥å£çš„,不过spring dm支持åŸÞZºŽ¾cȝš„导出、导入,但是˜q˜æ˜¯å»ø™®®ž®½é‡åŸÞZºŽæŽ¥å£åQŒåº”该记住面向接口编½E‹çš„æ€æƒ³åQŒä»¥åº”对ž®†æ¥æœ‰å¯èƒ½å‘生的改变ã€?br /> <br /> <strong>5.    ˜qè¡Œ<br /> </strong>      ç”׃ºŽaddå’Œmultiply都是åŸÞZºŽCompute接口对外导出服务åQŒé‚£ä¹ˆClient到底导入的是哪个服务呢?默认情况下,会导入启动较早的bundle服务åQˆOSGi在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://www.aygfsteel.com/images/blogjava_net/benniaolk/OSGi/Spring与OSGi的整å?12.png" width="1007" border="0" /><br />         之后ž®±å¯ä»¥é…¾|®è¿è¡Œäº†åQŒéšä¾¿åœ¨ä¸€ä¸ªbundle工程上右键,Run As->Run ConfigurationsåQŒæ–°å»ÞZ¸€ä¸ªOSGi Platform˜qè¡Œ™å¹ï¼ˆå³é”®OSGi Platform卛_¯åQ‰ï¼Œå¦‚下图所½Cºï¼š<br /> <img height="652" alt="" src="http://www.aygfsteel.com/images/blogjava_net/benniaolk/OSGi/Spring与OSGi的整å?13.png" width="958" border="0" /><br /> <p>       éœ€è¦å‹¾é€‰ä¸­spring bundle版(2.5.6åQ‰ï¼Œspring dm的几个核心包åQšcore、extender、io再点validate bundles按钮åQŒæ ¡éªŒæ˜¯å¦å·²å…¨éƒ¨é€‰ä¸­å…¶ä¾èµ–çš„bundle。然后即可点击运行了ã€?br />        ˜qè¡Œä¹‹åŽåQŒæˆ‘们发现控制台输出¾l“æžœåQ?br /> The Sum is---11<br /> 通过ss命ä×oåQŒå¦‚下:<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 7åQŒæŽ§åˆ¶å°è¾“出如下¾l“æžœåQ?br /> The Multiply is---30<br /> 通过 ss 命ä×oåQŒå¦‚下:<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>附äšgåQ?a href="/Files/benniaolk/OSGi/Spring与OSGi的整å?1.rar">osgi.example.compute.rar</a></em></strong><br /> </p> <img src ="http://www.aygfsteel.com/benniaolk/aggbug/316756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/benniaolk/" target="_blank">Dreava</a> 2010-03-28 17:36 <a href="http://www.aygfsteel.com/benniaolk/articles/316756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>åŸÞZºŽEquinox开发HelloWorldhttp://www.aygfsteel.com/benniaolk/articles/316755.htmlDreavaDreavaSun, 28 Mar 2010 08:58:00 GMThttp://www.aygfsteel.com/benniaolk/articles/316755.htmlhttp://www.aygfsteel.com/benniaolk/comments/316755.htmlhttp://www.aygfsteel.com/benniaolk/articles/316755.html#Feedback0http://www.aygfsteel.com/benniaolk/comments/commentRss/316755.htmlhttp://www.aygfsteel.com/benniaolk/services/trackbacks/316755.html1. å¼€å‘环境的准备

        现在的eclipse都已¾låŒ…含了EquinoxåQŒæ— éœ€å•独下蝲ã€?br /> 2. å¼€å‘OSGiçš„HelloWorld应用½E‹åº

       在这一节,我们ž®†å¼€å‘一个OSGi bundleåQŒæ¼”½Cºå¦‚何利用Equinox˜q›è¡ŒOSGi bundle的开发、运行及调试åQŒäؓ之后的示例做准备ã€?br />        首先åQŒæ–°å»ÞZ¸€ä¸ªPlug-in工程åQŒå¦‚下图所½Cºï¼š

下一步,注意选择目标òq›_°åQŒé»˜è®¤äØ“Eclipse version *åQŒå°†å…¶æ”¹æˆEquinoxåQŒå¦‚下图所½Cºï¼š


之后按默认下一步即可,到最后一步时åQŒæ— éœ€æ ÒŽ®æ¨¡æ¿åˆ›å¾å·¥ç¨‹åQŒåŽ»æŽ‰é»˜è®¤çš„å‹¾ï¼Œå¦‚ä¸‹å›¾ï¼š


点击完成åQŒåˆ›å»ºçš„工程目录如下图所½Cºï¼š


从图中,可以看到åQŒeclipse为工½E‹è‡ªåŠ¨ç”Ÿæˆäº†ä¸€ä¸ªActivator¾c»ï¼Œå¦‚下所½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在Equinoxòq›_°ä¸­çš„启动入口åQŒç›¸å½“于我们的熟悉的main函数åQŒå¦‚果将该bundle˜qè¡Œåˆ°Equinox中,首先˜q›å…¥è¯¥bundle的是Activatorçš„startæ–ÒŽ³•åQŒä½ å¯ä»¥ž®†ç›¸å…³çš„æœåŠ¡ã€èµ„æºåœ¨è¯¥æ–¹æ³•å†…å®Œæˆå‘bundleContext的注册——文章后面会具体讲到相关内容。在˜qè¡ŒæœŸï¼Œå¦‚果惌™¦è¯¥bundle停止˜qè¡ŒåQŒEquinoxòq›_°ž®†è°ƒç”¨Activatorçš„stopæ–ÒŽ³•åQŒä½ å¯ä»¥åœ¨è¯¥æ–ÒŽ³•内完成资源的注销½{‰å·¥ä½œã€?br />         下面我们ž®†è¦å®Œæˆé¦–次的Equinox˜qè¡ŒåQŒå°†å‘大家展现bundle到底是如何运行è“væ¥çš„ã€‚äØ“helloworld选择˜qè¡Œæ–¹å¼åQŒå¦‚下图所½Cºï¼š

        弹出如下对话框:

        在弹出的对话框中åQŒæ–°å»ÞZ¸€ä¸ªOSGi Framework˜qè¡ŒçŽ¯å¢ƒåQˆåŒå‡»OSGi Framework卛_¯åQŒè¿™é‡Œäؓ其取名EquinoxåQ‰ï¼Œé€‰ä¸­helloworld(1.0.0)åQŒç„¶åŽç‚¹å‡Õd³è¾¹çš„Add Required Bundles按钮åQŒeclipsež®†è‡ªåЍ选䏭˜qè¡Œhelloworld的依赖bundleåQŒå¦‚果有必要åQŒå¯ä»¥ç‚¹å‡Õd³ä¸‹çš„Validate Bundles验证按钮åQŒéªŒè¯ç¨‹åºæ­£å¸¸è¿è¡Œæ‰€éœ€çš„bundle是否都被选中åQŒæœ€åŽç‚¹å‡»è¿è¡Œï¼Œå›žåˆ°æŽ§åˆ¶åŽÍ¼š
osgi> Hello World!
        可以看到åQŒä¹‹å‰åœ¨Activatorçš„startæ–ÒŽ³•中的输出语句已经被输出到控制収ͼŒæˆ‘们可以通过命ä×oss查看Equinox的运行情况,可以看到一å…Þp¿è¡Œäº†ä¸¤ä¸ªbundleåQŒå¦‚下:
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çŠ¶æ€å§åQŸhelloworld已经˜qè¡Œèµäh¥äº†ã€?br />         那么Equinox具体支持哪些命ä×o呢?下表列出了主要的一些命令,如需查看更详¾l†çš„命ä×o清单åQŒåˆ™å¯ä»¥åœ¨æŽ§åˆ¶å°é”®å…¥helpã€?/p>

¾cÕdˆ«

命ä×o

含义

控制框架

launch

启动框架

shutdown

停止框架

close

关闭、退出框�/p>

exit

立即退出,相当�System.exit

init

卸蝲所æœ?bundleåQˆå‰ææ˜¯å·²ç» shutdownåQ?/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 不同的是不会引è“vé˜Õd¡ž

gc

促ä‹É垃圾回收

getprop

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

控制启动¾U§åˆ«

sl

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

setfwsl

讄¡½®æ¡†æž¶çš?start level

setbsl

讄¡½® bundle çš?start level

setibsl

讄¡½®åˆå§‹åŒ?bundle çš?start level

        è‡Ïx­¤åQŒæˆ‘们已¾læˆåŠŸçš„æ¼”ç¤ºäº†helloworldåQŒåˆæ­¥äº†è§£äº†OSGiçš„bundleæ˜¯å¦‚ä½•å¼€å‘åÆˆ˜qè¡Œçš„ã€?br />



]]>
GEF实现Eclipseçš„Outline视图http://www.aygfsteel.com/benniaolk/articles/316754.htmlDreavaDreavaSun, 28 Mar 2010 08:39:00 GMThttp://www.aygfsteel.com/benniaolk/articles/316754.htmlhttp://www.aygfsteel.com/benniaolk/comments/316754.htmlhttp://www.aygfsteel.com/benniaolk/articles/316754.html#Feedback0http://www.aygfsteel.com/benniaolk/comments/commentRss/316754.htmlhttp://www.aygfsteel.com/benniaolk/services/trackbacks/316754.html1ã€?nbsp;首先要实现EditPartFactory接口——EditPartFactoryOutlineImpåQŒè¯¥æŽ¥å£ä¸ºOutline视图提供控制器EditPart对象åQŒæ³¨æ„è¯¥EditPartFactoryImp要与¾~–辑视图——即真正的编辑区的EditPartFactory接口实现¾c»PartFactoryEditAreaImp保持一è‡ß_¼Œå¦åˆ™æ— æ³•同步¾~–辑åŒÞZ¸ŽOutline的同步。当ç„Óž¼Œòq¶ä¸æ˜¯ç¼–辑区的所有元素都应反应到Outline视图中,˜q™è¦æ ÒŽ®è‡ªå·±çš„需要在EditPartFactoryOutlineImp创徏EditPart对象ã€?br /> 2ã€?nbsp;Outline视图中的树控制器的构建:需要实现EditPartFactory接口——TreePartFactoryåQŒå®žçްpublic EditPart createEditPart(EditPart context, Object model)æ–ÒŽ³•åQŒåœ¨è¯¥æ–¹æ³•里为每个结点——model创徏其子模型的树模型。Outline的树¾l“构的根¾l“点应该在编辑区的——GraphicalEditorWithFlyoutPalette¾l§æ‰¿¾cȝš„内部¾c»ContentOutlinePage¾l§æ‰¿¾cȝš„public void createControl(Composite parent)æ–ÒŽ³•中进行创建,通过getViewer().setContents(model)æ–ÒŽ³•ž®†æ ¹æ¨¡åž‹æ³¨å…¥Outline视图中ã€?br /> 另外åQŒäؓ了维护Outline的树åQŒéœ€è¦ç‘ô承AbstractTreeEditPartåQŒåŠå®žçްPropertyChangeListener接口åQŒä¸»è¦éœ€è¦é‡è½½æˆ–å®žçŽ°çš„ä¸€äº›æ–¹æ³•äØ“åQ?/p>
//此方法负责处理由于鼠标选中或更改对树造成的变化,å¯ÒŽ ‘¾l“æž„˜q›è¡Œåˆäh–°   
public void propertyChange(PropertyChangeEvent evt)   
//树结点的图标   
protected Image getImage()   
//树结点的文本   
protected String getText()   
//该方法负责处理由于鼠标选中或其他事件激‹zÀLŸæ ‘结点该做的事情åQŒå¦‚æžœäØ“è¯¥æ ‘¾l“点æ·ÕdŠ PropertyChangeListenerã€?nbsp;  
public void activate()   
//与上面的æ–ÒŽ³•相反   
public void deactivate()   
//得到当前树结点的模型   
protected List getModelChildren()  


      补充资料åQ?br />       在Eclipse 里,当编辑器åQˆEditoråQ‰è¢«‹È€‹zÀL—¶åQŒå¤§¾U²è§†å›¾è‡ªåŠ¨é€šè¿‡˜q™ä¸ª¾~–辑器的getAdapter()æ–ÒŽ³•å¯ÀL‰¾å®ƒæä¾›çš„大纲åQˆå¤§¾U²å®žçްIcontentOutlinePage 接口åQ‰ã€‚GEF 提供了ContentOutlinePage ¾cȝ”¨æ¥å®žçް大¾U²è§†å›¾ï¼Œæˆ‘们要做的就是实çŽîC¸€ä¸ªå®ƒçš„子¾c»ï¼Œòq‰™‡ç‚¹å®žçްcreateControl()æ–ÒŽ³•。ContentOutlinePage 是org.eclipse.ui.part.Page 的一个子¾c»ï¼Œå¤§çº²è§†å›¾åˆ™æ˜¯PageBookView 的子¾c»ï¼Œåœ¨å¤§¾U²è§†å›¾ä¸­æœ‰ä¸€ä¸ªPageBookåQŒåŒ…含了很多Page òq¶å¯ä»¥åœ¨å®ƒä»¬ä¹‹é—´åˆ‡æ¢åQŒåˆ‡æ¢çš„依据ž®±æ˜¯å½“前‹zÕdŠ¨çš„Editor。因此,我们在createControl()æ–ÒŽ³•里要做的ž®±æ˜¯æž„造这个PageåQŒç®€åŒ–后的代码如下所½Cºï¼š

private Control outline;   
public OutlinePage() {   
   
super(new TreeViewer());   
}
   
public void createControl(Composite parent) {   
    outline 
= getViewer().createControl(parent);   
    getSelectionSynchronizer().addViewer(getViewer());   
    getViewer().setEditDomain(getEditDomain());   
    getViewer().setEditPartFactory(
new TreePartFactory());   
    getViewer().setContents(getDiagram());   
}
  

     ç”׃ºŽæˆ‘们在构造方法里指定了ä‹É用树¾l“构昄¡¤ºå¤§çº²åQŒæ‰€ä»¥createControl()里的½W¬ä¸€å¥å°±ä¼šä‹Éoutline 变量得到一个TreeåQˆè§org.eclipse.gef.ui.parts.TreeViewer 的代码)åQŒç¬¬äºŒå¥æŠŠTreeViewer 加到选择同步器中åQŒä»Žè€Œè®©ç”¨æˆ·ä¸è®ºåœ¨å¤§¾U²æˆ–¾~–辑区域里选择EditPart æ—Óž¼Œå¦ä¸€æ–šwƒ½èƒ½è‡ªåŠ¨åšå‡ºåŒæ ïLš„选择åQ›æœ€åŽä¸‰è¡Œçš„作用在以前的帖子里都有介¾lï¼Œæ€ÖM½“目的是把大纲视图的模型与¾~–辑区域的模型联¾pÕdœ¨ä¸€èµøP¼Œ˜q™æ ·åQŒå¯¹äºŽåŒä¸€ä¸ªæ¨¡åž‹æˆ‘们就有了两个视图åQŒä½“会到MVC 的好处了吧ã€?br /> 实现大纲视图最重要的工作基本就是这些,但还没有完,我们要在init()æ–ÒŽ³•里绑定UNDO/REDO/DELETE ½{‰å‘½ä»¤åˆ°Eclipse ä¸Èª—口,否则当大¾U²è§†å›‘Ö¤„于活动状态时åQŒä¸»å·¥å…·æ¡ä¸Šçš„这些命令就会变ä¸ÞZ¸å¯ç”¨çŠ¶æ€ï¼›åœ?getControl()æ–ÒŽ³•里要˜q”回我们的outline 成员变量åQŒä¹Ÿž®±æ˜¯æŒ‡å®šè®©è¿™ä¸ªæŽ§ä»¶å‡ºçŽ°åœ¨å¤§çº²è§†å›¾ä¸­ï¼›åœ¨dispose()æ–ÒŽ³•里应该把˜q™ä¸ªTreeViewer 从选择同步器中¿U»é™¤åQ›æœ€åŽï¼Œå¿…须在PracticeEditor 里覆盖getAdapter()æ–ÒŽ³•åQŒå‰é¢è¯´˜q‡ï¼Œ˜q™ä¸ªæ–ÒŽ³•是在Editor ‹È€‹zÀL—¶è¢«å¤§¾U²è§†å›¾è°ƒç”¨çš„åQŒæ‰€ä»¥åœ¨˜q™é‡Œå¿…须把我们实现好的OutlinePage ˜q”回¾l™å¤§¾U²è§†å›¾ä‹É用,代码如下åQ?/p>

public Object getAdapter(Class type) {   
  
if (type == IContentOutlinePage.class)   
  
return new OutlinePage();   
  
return super.getAdapter(type);   
}
  


]]>
Java序列化及反序列化http://www.aygfsteel.com/benniaolk/articles/316753.htmlDreavaDreavaSun, 28 Mar 2010 08:33:00 GMThttp://www.aygfsteel.com/benniaolk/articles/316753.htmlhttp://www.aygfsteel.com/benniaolk/comments/316753.htmlhttp://www.aygfsteel.com/benniaolk/articles/316753.html#Feedback0http://www.aygfsteel.com/benniaolk/comments/commentRss/316753.htmlhttp://www.aygfsteel.com/benniaolk/services/trackbacks/316753.html1.概述

     要实现序列化åQŒåˆ™å¿…须实现serializable或Externalizable接口。后者ç‘ô承自前者,两者的区别åQšå®žçŽ°å‰è€…çš„¾cÕd¯ä»¥é‡‡ç”¨é»˜è®¤çš„序列化方式。而实现后者的¾cÕdˆ™å®Œå…¨ç”Þp‡ªíw«æ¥æŽ§åˆ¶åºåˆ—åŒ–çš„è¡ŒäØ“ã€?br />      在序列化和反序列化过½E‹ä¸­éœ€è¦ç‰¹ŒDŠå¤„理的¾cÕd¿…™åÖM‹É用下列准¼‹®ç­¾åæ¥å®žçްç‰Òޮп–ÒŽ³•åQ?/p>

private void writeObject java.io.ObjectOutputStream out) throws IOException   
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;  

     writeObject æ–ÒŽ³•负责写入特定¾cȝš„对象的状态,以便相应çš?readObject æ–ÒŽ³•可以˜q˜åŽŸå®ƒã€‚é€šè¿‡è°ƒç”¨ out.defaultWriteObject 可以调用保存 Object 的字ŒD늚„默认机制。该æ–ÒŽ³•本èín不需要涉及属于其­‘…类或子¾cȝš„状态。状态是通过使用 writeObject æ–ÒŽ³•或ä‹Éç”?DataOutput 支持的用于基本数据类型的æ–ÒŽ³•ž®†å„个字ŒDµå†™å…?ObjectOutputStream 来保存的ã€?
      readObject æ–ÒŽ³•è´Ÿè´£ä»Žæµä¸­è¯»å–åÆˆ˜q˜åŽŸ¾cÕd­—ŒDüc€‚它可以调用 in.defaultReadObject 来调用默认机åˆÓž¼Œä»¥è¿˜åŽŸå¯¹è±¡çš„éžé™æ€å’Œéžçž¬æ€å­—ŒDüc€‚defaultReadObject æ–ÒŽ³•使用‹¹ä¸­çš„信息来分配‹¹ä¸­é€šè¿‡å½“前对象中相应命名字ŒDµä¿å­˜çš„对象的字ŒDüc€‚这用于处理¾cÕd‘展后需要添加新字段的情形。该æ–ÒŽ³•本èín不需要涉及属于其­‘…类或子¾cȝš„状态。状态是通过使用 writeObject æ–ÒŽ³•或ä‹Éç”?DataOutput 支持的用于基本数据类型的æ–ÒŽ³•ž®†å„个字ŒDµå†™å…?ObjectOutputStream 来保存的ã€?nbsp;
      å‡å®šæœ‰ä¸€ä¸ªåä¸ºCustomer的类åQŒå®ƒçš„对象需要序列化åQŒå¦‚æžœCustomer¾cÖM»…仅实çŽîCº†Serializable接口的类åQŒé‚£ä¹ˆå°†æŒ‰ç…§ä»¥ä¸‹æ–¹å¼åºåˆ—化及反序列化Customer对象åQ?br />
  • ObjectOutputStream采用默认的序列化方式åQŒå¯¹Customer对象的非transient的实例变量进行序列化ã€?
  • ObjectInputStream采用默认的反序列化方式,对Customer对象的非transient的实例变量进行反序列化ã€?
   如果Customer¾cÖM»…仅实çŽîCº†Serializable接口的类åQŒåƈ且还定义了readObject(ObjectInputStream in)å’ŒwriteObject(ObjectOutputStream out)æ–ÒŽ³•åQŒé‚£ä¹ˆå°†æŒ‰ç…§ä»¥ä¸‹æ–¹å¼åºåˆ—化及反序化Customer对象åQ?
  • ObjectOutputStream会调用Customer¾cȝš„writeObject(ObjectOutputStream out)æ–ÒŽ³•来进行序列化ã€?
  • ObjectInputStream会调用Customer¾cȝš„readObject(ObjectInputStream in)æ–ÒŽ³•来进行反序列化ã€?

     如果Customer¾cÕd®žçŽîCº†Externalizable接口åQŒé‚£ä¹ˆCustomer¾cÕd¿…™åÕd®žçްreadExternal
     (ObjectInput in)å’ŒwriteExternal(ObjectOutput out)æ–ÒŽ³•。在˜q™ç§æƒ…况下,ž®†æŒ‰ç…§ä»¥ä¸‹æ–¹å¼åºåˆ—化及反序列化Customer对象åQ?/p>

  • ObjectOutputStream会调用Customer¾cȝš„writeExternal(ObjectOutput out)æ–ÒŽ³•来进行序列化ã€?
  •  ObjectInputStream先通过Customer¾cȝš„不带参数的构造方法创å»ÞZ¸€ä¸ªCustomer对象åQŒç„¶åŽè°ƒç”¨å®ƒçš„readExternal(ObjectInput int)æ–ÒŽ³•来进行反序列化ã€?

2.实现Serializable接口

       ObjectOutputStream只能对实çŽîCº†Serializable接口的类的对象进行序列化。默认情况下åQŒObjectOutputStream按照默认方式序列化,˜q™ç§åºåˆ—化方式仅仅对对象的非transient的实例变量进行序列化åQŒè€Œä¸ä¼šåºåˆ—化对象的transient的实例变量,也不会序列化静态变量ã€?/p>

      而当ObjectInputStream按照默认方式反序列化æ—Óž¼Œæœ‰ä»¥ä¸‹ç‰¹ç‚¹ï¼š

  • 如果在内在中对象所属的¾c»è¿˜æ²¡æœ‰è¢«åŠ è½½ï¼Œé‚£ä¹ˆä¼šå…ˆåŠ è²òq¶åˆå§‹åŒ–˜q™ä¸ª¾c…R€‚如果在classpath中不存在相应的类文äšgåQŒé‚£ä¹ˆä¼šæŠ›å‡ºClassNotFoundExceptionã€?
  • 在反序列化时不会调用¾cȝš„ä»ÖM½•构造方法ã€?

     被transient修饰½W¦æ¥ä¿®é¥°çš„实例变量是不会序列化的åQŒä¸€èˆ¬ç”¨transient来修é¥îC»¥ä¸‹ç±»åž‹çš„的变量:

    åQ‘) å®žä¾‹å˜é‡ä¸ä»£è¡¨å¯¹è±¡çš„固有的内部数据,仅仅代表å…ähœ‰ä¸€å®šé€»è¾‘含义的äÍ时数据ã€?br />     åQ’) å®žä¾‹å˜é‡è¡¨ç¤ºä¸€äº›æ¯”较敏感的信息åQŒå¦‚密码åQŒå‡ºäºŽå®‰å…¨æ–¹é¢çš„原因åQŒä¸å¸Œæœ›å¯¹å…¶åºåˆ—化ã€?br />     åQ“) å®žä¾‹å˜é‡éœ€è¦æŒ‰ç…§ç”¨æˆ¯‚‡ªå®šä¹‰çš„æ–¹å¼åºåˆ—化åQŒå¦‚¾lè¿‡åŠ å¯†åŽå†åºåˆ—åŒ–ã€‚è¿™˜q™ç§æƒ…况下可以将其用transient修饰åQŒç„¶åŽåœ¨writeObject()æ–ÒŽ³•中对其序列化ã€?nbsp;  

åQ?åQ‘序列化对象å›?/h2>

    参见SerializableDemo中的Customer2及Order2¾cÖM¹‹é—´çš„关系ã€?br />     当通过ObjectOutputStream对象的writeObject(customer)æ–ÒŽ³•序列化Customer2对象æ—Óž¼Œä¹Ÿä¼šåºåˆ—化与它关联的Order2对象。而当通过ObjectInputStream对象的readObject()æ–ÒŽ³•反序列化Customer2对象æ—Óž¼Œå®žé™…上会å¯ÒŽ•´ä¸ªå¯¹è±¡å›¾ååºåˆ—化ã€?br />     如果对象A持有对象B的引用(注意是A持有B的引用)åQŒä»¥åŠé—´æŽ¥æŒæœ‰å…¶ä»–对象的引用åQŒåˆ™æŒ‰ç…§é»˜è®¤æ–¹å¼åºåˆ—化对象Aæ—Óž¼Œä¼šå°†A以及A持有的以及间接持有的所有对象都序列化。反序列化也是如此ã€?/p>

   

åQ?åQ’控制序列化的行ä¸?/h2>

    å¦‚果用户希望控制¾cȝš„序列化方式,可以在可序列化类中提供以下åŞ式的writeObject()æ–ÒŽ³•å’ŒreadObject()æ–ÒŽ³•åQ?/p>

private void writeObject java.io.ObjectOutputStream out)throws IOException   
private void readObject java.io.ObjectInputStream in)throws IOException,ClassNotFoundException;  

    ä¸€èˆ¬çš„做法是,在writeObject()æ–ÒŽ³•中,选留骼ObjectOutputStreamçš„defaultWriteObject()æ–ÒŽ³•åQŒä‹É得对象输出流先执行默认的序列化操作ã€?br />     反序列化æ—Óž¼Œåœ¨readObject()æ–ÒŽ³•中,先调用ObjectInputStreamçš„defaultReadObject()æ–ÒŽ³•ã€?/p>

   

åQ?åQ“readResolve()æ–ÒŽ³•在童便类中的˜qç”¨


    如果一个类提供了readResolve()æ–ÒŽ³•åQŒé‚£ä¹ˆåœ¨æ‰§è¡Œååºåˆ—化操作æ—Óž¼Œå…ˆæŒ‰ç…§é»˜è®¤æ–¹å¼æˆ–者用戯‚‡ªå®šä¹‰çš„æ–¹å¼è¿›è¡Œååºåˆ—化,最后再调用readResolve()æ–ÒŽ³•åQŒè¯¥æ–ÒŽ³•˜q”å›žçš„å¯¹è±¡äØ“ååºåˆ—åŒ–çš„æœ€¾lˆç»“æžœã€?br />     readResolve()æ–ÒŽ³•应该能够被类本èín、同一个包中的¾c»ï¼Œæˆ–者访问,因此readResolve()æ–ÒŽ³•的访问权限可以是pirvate、默认或protected¾U§åˆ«ã€?br />     readResolve()æ–ÒŽ³•用来重新指定反序列化得到的对象,与此对应åQŒJava序列化规范还允许在可序列化类中定义一个writeReplace()æ–ÒŽ³•åQŒç”¨æ¥é‡æ–°æŒ‡å®šè¢«åºåˆ—化的对象。writeReplace()æ–ÒŽ³•˜q”回一个Object¾cÕdž‹çš„对象,˜q™ä¸ª˜q”回对象才是真正要被序列化的对象。权限也可以ä¸ÞZ»¥ä¸Šä¸‰¿Uä¹‹ä¸€ã€?nbsp; 

åQ?实现Externalizalbe接口

       Externallizable接口¾l§æ‰¿è‡ªSerializable接口åQŒå¦‚果一个类实现了Externalizable接口åQŒé‚£ä¹ˆå°†å®Œå…¨ç”Þp¿™ä¸ªç±»æŽ§åˆ¶è‡ªèínçš„åºåˆ—åŒ–è¡ŒäØ“ã€‚Externalizable接口中声明了两个æ–ÒŽ³•åQ?br />

public void writeExternal(ObjectOutput out)throws IOException   
public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException  

    writeExternal负责序列化操作,readExternal负责反序列化操作。在对实çŽîCº†Externallizable接口的类的对象进行反序列化时åQŒä¼šå…ˆè°ƒç”¨ç±»çš„不带参数的构造方法,˜q™æ˜¯æœ‰åˆ«é»˜è®¤ååºåˆ—化方式的(见2åQ‰ã€‚所以实现Externalizable接口的类必须要有不含参数的构造方法ã€?/p>

 

åQ?可序列化¾cȝš„不同版本的序列化兼容æ€?/h1>

    实例见SerializableDemo里的Customer5的两个版本。将CustomeråQ?åQå’ŒSimpleServer攑֜¨server端,ž®†Customer2.0å’ŒSimpleClient攑֜¨Client端,直接˜qè¡ŒåQŒå°†å‘现抛出错误åQŒæ˜¾½CÞZ¸å…¼å®¹åQŒè§£å†›_Šžæ³•æ˜¯æ‰‹åŠ¨ž®†ä¸¤ä¸ªCustomerçš„serialVersionUIDè®¾äØ“åŒä¸€ä¸ªå€û|¼Œ˜q™æ ·ž®Þpƒ½å…¼å®¹ã€‚但是这¿UåŠžæ³•çš„èƒ½åŠ›å¾ˆæœ‰é™ï¼Œå½“ä¸€ä¸ªç±»çš„ä¸åŒç‰ˆæœ¬çš„serialVersionUID相同åQŒä»ç„¶æœ‰å¯èƒ½å‡ºçŽ°åºåˆ—åŒ–ä¸å…¼å®¹çš„æƒ…å†üc€‚因为序列化兼容性不仅取决于serialVersionUIDåQŒè¿˜å–决于类的不同版本的实现¾l†èŠ‚å’Œåºåˆ—åŒ–¾l†èŠ‚ã€?/p>

]]>详解finalize()http://www.aygfsteel.com/benniaolk/articles/316752.htmlDreavaDreavaSun, 28 Mar 2010 08:18:00 GMThttp://www.aygfsteel.com/benniaolk/articles/316752.htmlhttp://www.aygfsteel.com/benniaolk/comments/316752.htmlhttp://www.aygfsteel.com/benniaolk/articles/316752.html#Feedback0http://www.aygfsteel.com/benniaolk/comments/commentRss/316752.htmlhttp://www.aygfsteel.com/benniaolk/services/trackbacks/316752.html¾|‘上很多关于面试½W”试的一些题目,基本上都问到了同一个问题,finalize()的作用是什么?¾|‘上¾l™çš„½{”案说的可能比较½W¼ç»ŸåQŒä»Šå¤©åˆé‡æ¸©äº†ä¸€é?/span>Thinking in JavaåQŒåˆå›žé¡¾äº†ä¸€ä¸?/span>finalize()的意义和作用åQŒç‰¹æ„å†™å‡ºæ¥åQŒå§‘且作为备忘之用ã€?/span>

估计大家å¯?/span>finalize()都有个基本的认识åQŒé‚£ž®±æ˜¯ä½œæ¸…理资源之用。比如在¾cÈš„æŸä¸ªæ–ÒŽ³•中打开了一个文ä»Óž¼Œé‚£ä¹ˆä½ å¯èƒ½éœ€è¦é€šè¿‡finalize()æ–ÒŽ³•来释放该资源。但是话说回来,java世界里,一切皆对象åQŒè€Œä“Q何一个学javaçš„äh都知道,javaå¯¹è±¡æ˜¯ä¸éœ€è¦æ‰‹åŠ¨åŽ»æ¸…ç†çš„ï¼Œå› äØ“java有强大的垃圾回收器,有äh可能会有疑问åQŒé‚£æ—¢ç„¶å¦‚æ­¤åQŒäؓ什么还需要在finalize()中手动释放资源呢åQŸå½“ç„Óž¼Œé¢å¯¹˜q™ä¸€é—®é¢˜åQŒæœ‰å¾ˆå¥½çš„理由去解释åQŒå› ä¸ø™µ„源是有限的,而我们又知道垃圾回收器的¾U¿ç¨‹ä¼˜å…ˆ¾U§éžå¸æ€½ŽåQŒåœ¨é€ég¸å¾—以的情况下åQŒå®ƒæ‰ä¼šå·¥ä½œåQŒä¹Ÿž®±æ˜¯è¯ß_¼Œåªè¦å†…å­˜­‘›_¤ŸåQŒå¤±æ•ˆçš„对象ž®×ƒ¸ä¼šè¢«æ¸…理åQŒå®ƒæ‰€æŒæœ‰çš„资源也ž®±å¾—不到释放åQŒè€Œèµ„源又是有限的åQŒæ¯”如数据库˜qžæŽ¥åQŒæ‰€ä»¥éœ€è¦æˆ‘们去手动释放。不˜q‡è¿™ä¸€ç‚¹ï¼Œåœ?/span>JDK7里面ä¼ég¹Žæ˜¯æœ‰æ‰€å‘展åQŒå¬è¯´æ˜¯ä¼šè‡ªåŠ¨å®žçŽ°è¿™ä¸€ç‚¹ï¼Œä¹Ÿå°±æ˜¯è¯´åQ?/span>sun可能为我们做了这个工作,以后的程序中可能不需要手动释攄¡±»ä¼¼æ•°æ®åº“资源的代码了ã€?/span>

如果的确如此åQŒé‚£æ˜¯ä¸æ˜¯æ„å‘³ç€finalize()ž®±æ²¡ç”¨äº†å‘¢ï¼Ÿé”™ã€‚不˜q?/span>finalize()¼‹®å®žç”¨åˆ°çš„æ—¶å€™ä¸ä¼šå¾ˆå¤šï¼Œå®ƒä¸»è¦ç”¨äºŽä¸€äº›æœ¬åœ°æ–¹æ³•调用过½E‹ä¸­äº§ç”Ÿçš„资源清理。比如你通过Native method调用c语言çš?/span>mellocæ–ÒŽ³•分配了一些内存空é—ß_¼Œè€Œè¿™éƒ¨åˆ†å†…存是需è¦?/span>c语言çš?/span>free()来进行释攄¡š„åQŒå¦‚果不˜q™æ ·åQŒå°±ä¼šäñ”生内存泄漏,所以你需要在finalize()中用Native methodæ–ÒŽ³•调用free()ž®†å…¶é‡Šæ”¾ã€?/span>

不过话说回来åQ?/span>finalize()æ–ÒŽ³•òq¶ä¸ååˆ†ä¿é™©åQŒå› ä¸?/span>finalize()只有在垃圑֛žæ”¶å™¨å·¥ä½œçš„æ—¶å€™æ‰ä¼šè¢«è°ƒç”¨åQŒä¹Ÿž®±æ˜¯è¯ß_¼Œé€šè¿‡å®ƒè¿›è¡Œèµ„æºé‡Šæ”‘ÖÆˆä¸èƒ½¼‹®ä¿é©¬ä¸Šè¢«é‡Šæ”¾ï¼Œç”šè‡³å¯èƒ½æ ÒŽœ¬ä¸ä¼šè¢«é‡Šæ”¾ï¼ˆå› äؓ垃圾回收器可能不会工作)åQŒå› æ­¤ï¼Œèµ„源释放ž®½é‡å¦æƒ³åŠžæ³•åQŒåˆ«å¤ªç›¸ä¿?/span>finalize()和垃圑֛žæ”¶å™¨äº†ã€?/span>



]]>
乔迁声明http://www.aygfsteel.com/benniaolk/archive/2010/03/28/316751.htmlDreavaDreavaSun, 28 Mar 2010 08:11:00 GMThttp://www.aygfsteel.com/benniaolk/archive/2010/03/28/316751.htmlhttp://www.aygfsteel.com/benniaolk/comments/316751.htmlhttp://www.aygfsteel.com/benniaolk/archive/2010/03/28/316751.html#Feedback0http://www.aygfsteel.com/benniaolk/comments/commentRss/316751.htmlhttp://www.aygfsteel.com/benniaolk/services/trackbacks/316751.html阅读全文

]]>
OSGi和构件化开å?/title><link>http://www.aygfsteel.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://www.aygfsteel.com/benniaolk/articles/316738.html</guid><wfw:comment>http://www.aygfsteel.com/benniaolk/comments/316738.html</wfw:comment><comments>http://www.aygfsteel.com/benniaolk/articles/316738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/benniaolk/comments/commentRss/316738.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.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™æ˜¯åœ¨æ¡Œé¢åº”用的成功½CÞZ¾‹åQŒè€?/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: 宋体">创徏了独立的¾cÕdŠ è½½å™¨çŽ¯å¢ƒå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: 宋体">的热部çÖvåQŒé‚£ž®±æ„å‘³ç€å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: 宋体">¾lég¸Šæ‰€˜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://www.aygfsteel.com/benniaolk/aggbug/316738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/benniaolk/" target="_blank">Dreava</a> 2010-03-28 11:49 <a href="http://www.aygfsteel.com/benniaolk/articles/316738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSGi初识http://www.aygfsteel.com/benniaolk/articles/316739.htmlDreavaDreavaSun, 28 Mar 2010 03:47:00 GMThttp://www.aygfsteel.com/benniaolk/articles/316739.htmlhttp://www.aygfsteel.com/benniaolk/comments/316739.htmlhttp://www.aygfsteel.com/benniaolk/articles/316739.html#Feedback0http://www.aygfsteel.com/benniaolk/comments/commentRss/316739.htmlhttp://www.aygfsteel.com/benniaolk/services/trackbacks/316739.htmlOSGi诞生初期åQŒå…¶ç›®çš„主要是能够灵‹zÀL–¹ä¾¿åƈ˜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æ˜¯ä¸€ä¸ªå¼€æ”‘ÖÆˆä¸”提供通用接口标准的体¾pÀL¡†æžÓž¼ŒåŸÞZºŽ˜q™ä¸ªä½“系框架åQŒæœåŠ¡æä¾›å•†åQŒç¨‹åºå¼€å‘äh员,软äšg提供商,服务¾|‘管˜qè¥å•†ï¼Œè®‘Ö¤‡æä¾›å•†èƒ½å¤Ÿåè°ƒåœ°è”合èµäh¥å¼€å‘,部çÖv以及½Ž¡ç†å‘用æˆähä¾›çš„各种服务åQ‰ã€‚随着OSGi的发展,逐渐被引入到企业应用领域ã€?/span>

目前åQ?/span>OSGiè§„èŒƒçš„æœ€æ–°ç‰ˆæœ¬äØ“R4.2åQŒæœ‰å…Œ™¯¥è§„范的详¾l†æƒ…况请阅读OSGi实战的第7节—â€?a href="/Files/benniaolk/OSGi/OSGi初识/1.pdf">深入OSGiã€?/span>OSGiæ¡†æž¶ä¸»è¦åˆ†äØ“å››éƒ¨åˆ†ï¼š˜qè¡ŒçŽ¯å¢ƒåQ?/span>executionenvironmentåQ‰ã€æ¨¡å—(ModulesåQ‰ã€ç”Ÿå‘½å‘¨æœŸç®¡ç†ï¼ˆLife CycleåQ‰ã€æœåŠ¡æ³¨å†Œï¼ˆService RegistryåQ‰ã€‚运行在OSGi环境中的是一个个çš?/span>BundleåQŒä¹Ÿž®±æ˜¯Modules的具体实现ã€?/span>

对于每个bundleåQŒéƒ½æœ‰å„自的ClassLoaderåQŒåœ¨˜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™å‡ºä¸€ä¸ªå…·ä½“çš„½CÞZ¾‹ã€?/span>

ç”׃ºŽOSGiå…ähœ‰è‰¯å¥½çš„æ¨¡å—化¾l“æž„åQŒæˆ‘个ähè®¤äØ“˜q™å°†ä¸ºå°†æ¥çš„软äšg开发方式带来很大的冲击åQŒå°†æ›´è¿›ä¸€æ­¥æŽ¨˜q›æ¨¡å—化开发。目å‰?/span>Web应用的开发一般采ç”?/span>SSH框架åQŒå°†æ•´ä¸ªåº”ç”¨å¤§è‡´åˆ†äØ“WebåQˆè´Ÿè´£å‰å°å±•玎ͼ‰ã€?/span>ServiceåQˆè´Ÿè´£ä¸šåŠ¡é€»è¾‘å¤„ç†åQ‰ã€?/span>DAOåQˆè´Ÿè´£æ•°æ®æŒä¹…化åQ‰ã€?/span>DomainåQˆå…¨å±€å®žä½“¾c»ï¼‰å‡ ä¸ªæ¨¡å—åQŒè€Œå‘布的时候,ž®†è¢«ä¸€èµäh‰“æˆ?/span>WAR包,部çÖvè‡ÏxœåŠ¡å™¨ä¸Šã€‚å¦‚æžœé‡‡å?/span>bundleçš„åÅžå¼ï¼Œæ¯ä¸ªæ¨¡å—å¯ä»¥åšäØ“ç‹¬ç«‹çš?/span>bundle˜q›è¡Œå¼€å‘和部çÖvåQ?/span>bundle之间的协作可以通过上述的方式进行,而这样带来的好处ž®±æ˜¯åQŒä¸€æ—¦éœ€è¦å¯¹æŸä¸ªæ¨¡å—˜q›è¡Œæ›´æ”¹åQŒåœ¨ä¿è¯ä¾èµ–接口不变的前提下åQŒå°±å¯ä»¥å•独更改相应çš?/span>bundleåQŒå†˜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的插件体¾p…R€‚另外还æœ?/span>Felixã€?/span>knopflerfish½{‰ã€?/span>

不过话说回来åQŒå°½½Ž?/span>OSGi有很多好处,但是现在主要˜q˜æ˜¯åº”用在服务器端,如现在的应用服务器基本上都采ç”?/span>OSGi的框æžÓž¼Œè€ŒçœŸæ­£çš„应用市场仍处理è“v步阶ŒDµï¼Œ˜q™å’ŒOSGi的生态环境还不成熟,可喜的是Spring推出了其Spring DMå’?/span>SpringSource DM ServeråQŒå‰è€…能够很方便发布和引用服务,òq¶ä¸”ä¸?/span>Spring Frameworkòq›_°ç›¸èžåˆï¼Œž®?/span>OSGiçš?/span>bundle contextä¸?/span>Spring applicationContextèžåˆåœ¨ä¸€èµøP¼Œå¤§å¤§æ–¹ä¾¿äº?/span>OSGi的应用。后者是OSGi bundle的运行环境,是一个将Equinoxå’?/span>Tomcat融合在一èµïLš„æœåŠ¡å™¨ã€‚åœ¨ä»¥åŽçš„åšæ–‡ä¸­ž®†è¯¦¾l†ä»‹¾lè¿™äº›å†…宏V€?/span>



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÁúÖÝÏØ| ÑǶ«ÏØ| ͨÓÜÏØ| À´±öÊÐ| ÓÀÈÊÏØ| ÈýÃ÷ÊÐ| ³¤Ñô| »á²ýÏØ| µÂ»¯ÏØ| ÄÉÓºÏØ| ͬÐÄÏØ| ÉÌÂåÊÐ| ÐÂÓàÊÐ| ¾äÈÝÊÐ| ÈýÑÇÊÐ| ÎåÔ­ÏØ| ÒË·áÏØ| ºÏË®ÏØ| °¢ÍßÌáÏØ| Æ½Ì¶ÏØ| ºÓÎ÷Çø| ÓÀ¾¸ÏØ| Û·ÉÆÏØ| Ç¦É½ÏØ| ̫ԭÊÐ| ÄþºÓÏØ| ÑŽ­ÏØ| ³¤ÖÎÏØ| Æ½Ô¶ÏØ| ·ö¹µÏØ| »³À´ÏØ| ÌÆºÓÏØ| Ρɽ| ξÊÏÏØ| »ô³ÇÏØ| ÓíÖÝÊÐ| ¿ªÑôÏØ| »ÆÆ½ÏØ| ×ÊÖÐÏØ| ²©°×ÏØ| ÔÀ³ØÏØ|