﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-yangbutao-文章分类-OSGI</title><link>http://www.blogjava.net/yangbutao/category/24754.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 25 Sep 2007 05:08:37 GMT</lastBuildDate><pubDate>Tue, 25 Sep 2007 05:08:37 GMT</pubDate><ttl>60</ttl><item><title>OSGI Module&amp;lifecycle</title><link>http://www.blogjava.net/yangbutao/articles/147773.html</link><dc:creator>阿不</dc:creator><author>阿不</author><pubDate>Mon, 24 Sep 2007 05:27:00 GMT</pubDate><guid>http://www.blogjava.net/yangbutao/articles/147773.html</guid><wfw:comment>http://www.blogjava.net/yangbutao/comments/147773.html</wfw:comment><comments>http://www.blogjava.net/yangbutao/articles/147773.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangbutao/comments/commentRss/147773.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangbutao/services/trackbacks/147773.html</trackback:ping><description><![CDATA[<div style="text-indent: 36.75pt"><strong><span style="font-size: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OSGI Module&amp;lifecycle</span></strong></div>
<div style="text-indent: 139.15pt"><strong>&nbsp;</strong></div>
<div style="text-indent: 36.75pt">OSGI概念中主要分为了Bundle和Service，可以认为Bundle是一个模块的管理器，主要是通过BundleActivator管理模块的生命周期，而Service则是这个模块可暴露对外的服务对象，这里体现了OSGI和传统的Plugin Framework不同的一个地方，管理和静态结构分开，在OSGI中通过在manifest.mf文件中增加一些内容来发布Bundle，在其中描述了Bundle的提供商、版本、唯一ID、classpath、暴露对外的包、所依赖的包；每个Bundle拥有自己的ClassLoader以及context，通过context可进行服务的注册、卸载等，这些操作都会通过事件机制广播给相应的其他的Bundle；一般来说都为通过在Bundle中编写初始需要注册的服务的方法来完成Bundle可供外部使用的服务的暴露功能；如需要调用其他Plugin提供的服务可通过context的getServiceReference先获取Service的句柄，再通过context.getService(ServiceReference)的方法获取Service的实体。</div>
<div style="text-indent: 15.75pt">前一段时间对osgi的service层做了介绍，下面介绍module和lifecycle层，在这里主要介绍lifecycle</div>
<div>系统框架对bundle的生命周期进行了管理。</div>
<div>osgi生命周期的管理，覆盖到bundle的安装，启动，停止，更新，卸载，和监控这么一个过程。</div>
<div style="margin: 13pt 0cm"><strong><font size="5"><span style="font-weight: normal; font-size: 10.5pt; line-height: 173%">Bundle</span><span style="font-weight: normal; font-size: 10.5pt; line-height: 173%">的生命周期</span></font></strong></div>
<div>下面是bundle的lifecycle的类图</div>
<div><img height="512" alt="" src="http://gocom.primeton.com/uploads/FCKUserFiles/Image/www.GIF" width="640" /></div>
<div>下面详细介绍bundle的几个对象</div>
<div align="right">&nbsp;</div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span>l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Bunlde 标识</div>
<div>&nbsp;Identifier</div>
<div>&nbsp;Location</div>
<div>&nbsp;symbolicName</div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span>l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>bundle的状态</div>
<div><span>&nbsp; </span>状态转换图</div>
<div><img alt="" src="http://gocom.primeton.com/uploads/FCKUserFiles/Image/eee.GIF" /></div>
<div style="margin: 0cm 0cm 0pt 26.25pt; text-indent: -21pt"><span>&#252;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>bundle的安装一般有两种方式：</div>
<div style="text-indent: 15.75pt">通过另外一个bundle的bundlecontext来完成</div>
<div style="text-indent: 15.75pt">通过命令行的形式（比如系统bundle一般是这样的）来完成的</div>
<div style="margin: 0cm 0cm 0pt 26.25pt; text-indent: -21pt"><span>&#252;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Bundle的解析（一般是在启动过程中完成的）</div>
<div style="margin: 0cm 0cm 0pt 15.75pt">根据bundle的定义，创建基于版本的module（<span style="font-size: 10pt; color: black">ModuleDefinition</span><span style="font-size: 10pt; color: black">，</span><span style="font-size: 10pt; color: black">ContentLoader</span><span style="font-size: 10pt; color: black">，</span><span style="font-size: 10pt; color: black">Wire</span>）</div>
<div style="margin: 0cm 0cm 0pt 26.25pt; text-indent: -21pt"><span>&#252;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Bundle的启动，由该bundle的调用start api来完成的</div>
<div style="text-indent: 5.25pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>这里包含创建该bundle的上下文（BundleContext）</div>
<div style="margin: 0cm 0cm 0pt 47.25pt; text-indent: -42pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>创建该bundle的activator，可以在activator里进行与该bundle相关的service的注册，bundlelistener，servicelistener ,frameworklistener的注册以及安装其他的bundle.等.</div>
<div style="margin: 0cm 0cm 0pt 47.25pt; text-indent: -42pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>是否要立即触发该activator，需要根据该bundle的activator policy来决定；在用bundle获取resource的时候，采取解析bundle，才创建该bundle的classloader和activate该bundle。这样能节省启动的时间，实现了懒加载。</div>
<div style="margin: 0cm 0cm 0pt 47.25pt; text-indent: -42pt">下图描述了bundle的启动过程中的状态变化</div>
<div style="margin: 0cm 0cm 0pt 47.25pt; text-indent: -42pt"><img height="512" alt="" src="http://gocom.primeton.com/uploads/FCKUserFiles/Image/qq.GIF" width="640" /></div>
<div style="margin: 0cm 0cm 0pt 26.25pt; text-indent: -21pt"><span>&#252;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Bundle的更新</div>
<div style="margin: 0cm 0cm 0pt 5.25pt">Bundle的更新，是从一个版本到另一个版本的迁移过程</div>
<div style="margin: 0cm 0cm 0pt 5.25pt">流程如下：</div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><span>1．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>检查bundle的状态</div>
<div style="margin: 0cm 0cm 0pt 18pt">如果是uninsalled，抛出异常</div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><span>2．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font>，但是不改变持久化的状态</span></span>Stop bundle</div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><span>3．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>版本的修订</div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><span>4．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>更改bundle的时间戳，状态设置成installed</div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><span>5．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>发送unresolved事件给bundle</div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><span>6．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>把该bundle的老的module做一个removal标记，表示不可用</div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><span>7．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>发送updated事件给bundle</div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><span>8．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>启动（start）bundle</div>
<div><span>&nbsp;&nbsp;&nbsp; </span></div>
<div style="margin: 0cm 0cm 0pt 26.25pt; text-indent: -21pt"><span>&#252;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Bundle的停止</div>
<div style="margin: 0cm 0cm 0pt 27pt; text-indent: -18pt"><span>1．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>把bundle的持久化状态设置成inactive</div>
<div style="margin: 0cm 0cm 0pt 27pt; text-indent: -18pt"><span>2．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>检查bundle的状态</div>
<div style="margin: 0cm 0cm 0pt 18pt">如果状态是Installed，Resolved，就返回</div>
<div style="margin: 0cm 0cm 0pt 18pt">如果是uninstalled，抛出异常</div>
<div style="margin: 0cm 0cm 0pt 18pt">如果是starting，stopping，抛异常</div>
<div style="margin: 0cm 0cm 0pt 18pt">如果ACTIVE，把bundle的状态设置成stopping，发stopping事件跟响应的bundle</div>
<div style="margin: 0cm 0cm 0pt 27pt; text-indent: -18pt"><span>3．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>调用该bundle的activator的stop操作，清理分配的资源</div>
<div style="margin: 0cm 0cm 0pt 27pt; text-indent: -18pt"><span>4．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>清除bundle的上下文</div>
<div style="margin: 0cm 0cm 0pt 27pt"><span style="font-size: 10pt; color: black">清理该</span><span style="font-size: 10pt; color: black">bundle</span><span style="font-size: 10pt; color: black">注册的</span><span style="font-size: 10pt; color: black">service</span></div>
<div style="margin: 0cm 0cm 0pt 27pt"><span style="font-size: 10pt; color: black">释放该</span><span style="font-size: 10pt; color: black">bundle</span><span style="font-size: 10pt; color: black">用到的</span><span style="font-size: 10pt; color: black">service</span></div>
<div style="margin: 0cm 0cm 0pt 27pt"><span style="font-size: 10pt; color: black">删除该</span><span style="font-size: 10pt; color: black">bundle</span><span style="font-size: 10pt; color: black">注册的</span><span style="font-size: 10pt; color: black">listener&nbsp;&nbsp; </span></div>
<div style="margin: 0cm 0cm 0pt 27pt; text-indent: -18pt"><span>5．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>该bundle的状态返回到resolved状态</div>
<div style="margin: 0cm 0cm 0pt 27pt; text-indent: -18pt"><span>6．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>发stopped事件给该bundle</div>
<div style="margin: 0cm 0cm 0pt 5.25pt">&nbsp;</div>
<div style="margin: 0cm 0cm 0pt 26.25pt; text-indent: -21pt"><span>&#252;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Bundle的卸载</div>
<div style="margin: 0cm 0cm 0pt 23.25pt; text-indent: -18pt"><span>1．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>Stop bundle</div>
<div style="margin: 0cm 0cm 0pt 23.25pt; text-indent: -18pt"><span>2．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>把该bundle从缓存中删除</div>
<div style="margin: 0cm 0cm 0pt 23.25pt; text-indent: -18pt"><span>3．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>把该bundle放入uninstall 类别中</div>
<div style="margin: 0cm 0cm 0pt 23.25pt; text-indent: -18pt"><span>4．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>该bundle状态设置成uninstalled</div>
<div style="margin: 0cm 0cm 0pt 23.25pt; text-indent: -18pt"><span>5．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>触发bundle的uninstall事件</div>
<div style="margin: 0cm 0cm 0pt 23.25pt; text-indent: -18pt"><span>6．<span style="font: 7pt 'Times New Roman'"><font size="3">&nbsp; </font></span></span>看是否有以来该bundle的module，如果没有则垃圾回收</div>
<div style="margin: 13pt 0cm"><strong><font size="5">Listener和事件机制<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></strong></div>
<div>关于这一部分功能和用法已在上一篇service层里已经做了介绍，这里只做一下简单的罗列</div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span>&#252;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Framework</div>
<div style="margin: 0cm 0cm 0pt 21pt">FrameworkListener：</div>
<div style="margin: 0cm 0cm 0pt 21pt">注册时间：</div>
<div style="margin: 0cm 0cm 0pt 21pt">触发时间：</div>
<div style="margin: 0cm 0cm 0pt 21pt">作用：OSGI environment</div>
<div style="text-indent: 10.5pt">&nbsp;FrameworkEvent: type，bundle，throwable</div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span>&#252;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Bundle</div>
<div style="text-indent: 21.75pt"><span style="font-size: 10pt; color: black">BundleListener</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 5.25pt">注册时间：</div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 5.25pt">触发时间：</div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 5.25pt">作用：<span style="font-size: 10pt; color: black">a bundle lifecycle change.</span></div>
<div style="text-indent: 21.75pt">BundleEvent: Bundle,type</div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span>&#252;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Service</div>
<div style="margin: 0cm 0cm 0pt 21pt">ServiceListener</div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 5.25pt">注册时间：</div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 5.25pt">触发时间：</div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 5.25pt">作用：a service lifecycle change.</div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 5.25pt">ServiceEvent:serviceReference ,type</div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 5.25pt">&nbsp;</div>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; width: 464.4pt; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" width="619" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 113.25pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="151">
            <div>资源</div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div>事件类型</div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div>触发时机</div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 113.25pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="151" rowspan="6">
            <div>Framework</div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; background: silver; color: black">STARTED</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div><span style="font-size: 10pt; color: black">Framework</span><span style="font-size: 10pt; color: black">启动完成</span></div>
            <div><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Framework has started after all installed bundles that are marked to be started have been started and the Framework has reached the intitial start level.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; background: silver; color: #0000c0">ERROR</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">There was an error associated with a bundle.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; background: silver; color: #0000c0">PACKAGES_REFRESHED</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf">
            <div><span style="font-size: 10pt; color: black">Framework has completed the refresh &nbsp;packages operation initiated by a call to the</span></div>
            <span style="font-size: 10pt; color: black">PackageAdmin.refreshPackages method.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; background: silver; color: #0000c0">STARTLEVEL_CHANGED</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf">
            <div><span style="font-size: 10pt; color: black">the Framework has completed changing the active start level initiated by a call to the StartLevel.setStartLevel</span></div>
            <span style="font-size: 10pt; color: black">method.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; background: silver; color: #0000c0">WARNING</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">There was a warning associated with a bundle.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; color: #0000c0">INFO</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">There was an informational event associated with a bundle.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 113.25pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="151" rowspan="8">
            <div>Bundle</div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; background: silver; color: #0000c0">INSTALLED</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">The bundle has been installed.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; color: #0000c0">STARTED</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">The bundle has been started.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; color: #0000c0">STOPPED</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">The bundle has been stopped.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; color: #0000c0">UNINSTALLED</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">The bundle has been uninstalled.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; color: #0000c0">RESOLVED</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">The bundle has been resolved.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; color: #0000c0">UNRESOLVED</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">The bundle has been unresolved.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; color: #0000c0">STARTING</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">The bundle is about to start.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; color: #0000c0">STOPPING</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">The bundle is about to stop.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 113.25pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="151" rowspan="4">
            <div>Service</div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; background: silver; color: #0000c0">REGISTERED</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">This service has been registered.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; color: #0000c0">MODIFIED</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">The properties of a registered service have been modified.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div><em><span style="font-size: 10pt; color: #0000c0">UNREGISTERING</span></em></div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left"><span style="font-size: 10pt; color: #3f5fbf">&nbsp;<span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'; mso-font-kerning: 0pt">This service is in the process of being unregistered.<O:P></O:P></span></span></div>
            <div align="left">&nbsp;</div>
            <div align="left"><span style="font-size: 10pt; color: black">
            <div><span style="font-size: 10pt; color: black">If a bundle is using a service that is &lt;code&gt;UNREGISTERING&lt;/code&gt;, the</span></div>
            <div><span style="font-size: 10pt; color: black">&nbsp;&nbsp;&nbsp; &nbsp;bundle should release its use of the service when it receives this event.</span></div>
            <div><span style="font-size: 10pt; color: black">&nbsp;&nbsp;&nbsp; &nbsp;If the bundle does not release its use of the service when it receives</span></div>
            <div><span style="font-size: 10pt; color: black">&nbsp;&nbsp;&nbsp; &nbsp;this event, the Framework will automatically release the bundle's use of</span></div>
            <span style="font-size: 10pt; color: black">&nbsp;&nbsp;&nbsp; &nbsp;the service while completing the service unregistration operation.</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 134pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="179">
            <div>&nbsp;</div>
            </td>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 217.15pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent" valign="top" width="290">
            <div align="left">&nbsp;</div>
            </td>
        </tr>
    </tbody>
</table>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><span>&nbsp;&nbsp; </span></div>
<div style="margin: 13pt 0cm"><strong><font size="5">资源的查找</font></strong></div>
<div>几点说明<br />
系统启动时候，会把所有职责的关联关系wire起来</div>
<div>并且创建核心的查找资源policy</div>
<div>还有就是有的module可以放在resolve阶段可以放到查找资源的时候进行，实现懒加载的功能</div>
<div>&nbsp;</div>
<div>1.查找资源的核心类，分发中心，所有的调度逻辑都在这里</div>
<div>2.所有的资源查找都代理到该核心类，有点象代理的方式</div>
<div>3.module的修改，这里会实时的得到更新（通过注册listener）</div>
<div>资源的查找：在本bundle的classloader范围内，进行class的查找，资源加载的顺序可以参见规范</div>
<div>下面是类查找的类图</div>
<div><img alt="" src="http://gocom.primeton.com/uploads/FCKUserFiles/Image/ss(1).gif" /></div>
<div>&nbsp;</div>
<div>该bundle的Classloader在bundle的resolve阶段就创建好了</div>
<div>关于bundle的说明定义中的import export详见规范</div>
<div style="margin: 13pt 0cm"><strong><font size="5">系统Bundle的启动过程</font></strong></div>
<div>1．系统bundle由框架启动，并且只启动一次</div>
<div>2． 创建服务的注册中心，该中心作为各种事件的分发场所。</div>
<div>3． 创建核心的查找资源的policy，加入resolver listener到该policy，可以在module解析后，得到通知更新bundle的状态</div>
<div>4． 初始化事件分发器</div>
<div>5. 在加载其他的bundle之前，创建系统的bundle负责容器相关的service，resolve系统bundle，创建系统bundle的activator，创建bundle的上下文，并触发activator</div>
<div>6. 安装其他的bundle</div>
<div>7&nbsp;触发系统bundle的started事件，标志系统bundle启动完成</div>
<div>8. 触发框架的started时间，标志框架启动完成</div>
<img src ="http://www.blogjava.net/yangbutao/aggbug/147773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangbutao/" target="_blank">阿不</a> 2007-09-24 13:27 <a href="http://www.blogjava.net/yangbutao/articles/147773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSGI服务层探究</title><link>http://www.blogjava.net/yangbutao/articles/136614.html</link><dc:creator>阿不</dc:creator><author>阿不</author><pubDate>Tue, 14 Aug 2007 03:44:00 GMT</pubDate><guid>http://www.blogjava.net/yangbutao/articles/136614.html</guid><wfw:comment>http://www.blogjava.net/yangbutao/comments/136614.html</wfw:comment><comments>http://www.blogjava.net/yangbutao/articles/136614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangbutao/comments/commentRss/136614.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangbutao/services/trackbacks/136614.html</trackback:ping><description><![CDATA[&nbsp;
<p><span></span>&nbsp;</p>
<p>&nbsp;</p>
<p><span>前段时间公司产品在</span><span>apache</span><span>的孵化项目</span><span>tuscany</span><span>的基础上，做了一些扩展了自己的一些实现。在项目中发现模块的动态更新带来的模型之间的依赖关系处理比较复杂；没有一套好的机智处理这种模块动态的更新，部署，以及解决他们之间的关系。</span></p>
<p><span>Osgi</span><span>的框架很好的解决了上面的问题，更够搭建动态化的系统可以说是</span><span>OSGI</span><span>在</span><span>sca</span><span>的部署策略上的一种很好的参考实现。</span></p>
<p><span>OSGI</span><span>规范中包括很多层，安全层，</span><span>Module </span><span>层，生命周期层，服务层等等</span></p>
<p><span>这里主要对服务层（</span><span>service layer</span><span>）做一下介绍</span></p>
<p><span>服务层定义了一个动态的协作模型，服务模型是定义在模块（</span><span>bundle</span><span>）的基础上的。</span></p>
<p><span>Bundle</span><span>可以动态的发布，查找</span><span>service</span><span>，并且当该服务的状态（生命周期）改变时，更够发出通知，这样所有对该</span><span>service</span><span>关心的</span><span>bundle</span><span>，可以通过注册监听器的方式，接收消息，做后续的处理。</span></p>
<p><span>下面是它的模型<br><br></span></p>
<p><img height=512 alt="" src="http://www.blogjava.net/images/blogjava_net/yangbutao/adasdadadadadasdasd.GIF" width=665 border=0><br></p>
<p><span>下面简单的加以说明：</span></p>
<p><span>在</span><span>osgi</span><span>平台中，各个模块（</span><span>bundle</span><span>）可以提供服务，并且可以引用其他的服务，而这些服务都有统一的管理注册中心（</span><span>ServiceRegistry</span><span>），该注册中心由框架提供，运行在框架之上的。</span></p>
<p><span>这样的一些服务都是归</span><span>bundle</span><span>所有并且运行在它的</span><span>bundle</span><span>上的；所以可以通过</span><span>bundle</span><span>的</span><span>bundlecontext</span><span>把这些服务注册在</span><span>ServiceRegistry</span><span>中，以便能够由框架统一管理，并且能够被其他的</span><span>bundle</span><span>所引用。这样当</span><span>bundle</span><span>的生命周期发生变化的时候，如</span><span>stop</span><span>，那么就能够通过框架，来自动的卸载提供的服务，并且解决好</span><span>bundle</span><span>之间的服务引用依赖关系。</span></p>
<p><span>服务对象</span><span>serviceobject</span><span>，类似与</span><span>pojo</span><span>，调用它的接口，可以提供服务。这样的一个</span><span>serviceobject</span><span>可以实现</span><span>ServiceFactory</span><span>接口，也可以实现其他的接口。如果实现了</span><span>ServiceFactory</span><span>，那么对于每一个</span><span>bundle</span><span>对服务的引用来说，都是一个通过</span><span>ServiceFactory</span><span>创建新的实例。否则所引用的服务对象就是通过</span><span>bundlecontext</span><span>注册的绑定在</span><span>ServiceRegistration </span><span>的原始对象。</span></p>
<p><span>ServiceReference</span><span>类似于服务对象的句柄，通过它可以查找到真实的服务对象。其实它只是包含了对对象的描述，如该服务是位于哪一个</span><span>bundle</span><span>上的，该服务的</span><span>bundle</span><span>是否已经停</span> <span>止，以及服务的描述等等。</span></p>
<p><span>对于引用该服务的</span><span>bundle</span><span>来说，只是保存的</span><span>service</span><span>的句柄，真实的</span><span>service</span><span>对象可以不存在，这样的模式被广泛应用在动态的环境中。</span></p>
<p><span>ServiceListener</span><span>可以通过</span><span>BundleContext</span><span>注册在框价</span><span>ServiceRegistry</span><span>中，这样在服务的生命周期改变时候，可以接收消息，每个</span><span>bundle</span><span>可以在自己的</span><span>lisitener</span><span>里，做出相应的处理，如释放响应的资源等等。</span></p>
<p><span>BundleContext</span><span>提供了注册服务，注册服务，框架，</span><span>bundle</span><span>的监听器，查找服务的统一入口。</span></p>
<p>&nbsp;</p>
<p><span>暂时写这么多，待叙</span></p>
<img src ="http://www.blogjava.net/yangbutao/aggbug/136614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangbutao/" target="_blank">阿不</a> 2007-08-14 11:44 <a href="http://www.blogjava.net/yangbutao/articles/136614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>