<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>EA & IT Governance</title>
    <description>An open community to promote knowledge sharing of Enterprise Architecture and IT goverance, to be a good repository of relevant articles, papers, best practices and so on.

Anything relate to Corporate Information Systems, Enterprise Architecture, IT Governance, System Integration are welcome.

</description>
    <link>http://EnterpriseArchitecture.group.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>OpenCore:基于OSGi开发纯插件体系结构的WEB应用程序</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://EnterpriseArchitecture.group.javaeye.com/group/blog/50624" style="color:red;">http://EnterpriseArchitecture.group.javaeye.com/group/blog/50624</a>&nbsp;
          发表时间: 2007年01月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          随着OSGi/Equinox逐渐成为Java EE服务端的基础软件架构，OSGi上部署WEB应用程序的解决方案日渐成熟。这里介绍三种目前我们所知的解决方案，前两种是Equinox组织提出的方案，后一种是OpenCore平台采取的解决方案。<br />
<h3>解决方案一: 部署OSGi/Equinox在Servlet容器中</h3>
具体实现: 把OSGi/equinox打包在WAR中，当Servlet容器加载WAR时，启动OSGi框架。<br />
WEB-INF的目录结构大致如下(大致如此):<br />
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span>*&nbsp;/WEB-INF&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;/web.xml&nbsp;(with&nbsp;one&nbsp;servlet&nbsp;entry&nbsp;assigning&nbsp;all&nbsp;incoming&nbsp;requests&nbsp;to&nbsp;the&nbsp;BridgeServlet)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;/lib/servletbridge.jar&nbsp;(the&nbsp;classes&nbsp;associated&nbsp;with&nbsp;the&nbsp;equinox.servletbridge)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;/eclipse&nbsp;(the&nbsp;eclipse&nbsp;platform&nbsp;directory)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;launch.ini&nbsp;(contains&nbsp;framework&nbsp;properties&nbsp;that&nbsp;will&nbsp;allow&nbsp;override&nbsp;of&nbsp;any&nbsp;eclipse&nbsp;specific&nbsp;System&nbsp;Properties)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;/configuration&nbsp;(contains&nbsp;config.ini&nbsp;which&nbsp;lists&nbsp;the&nbsp;bundles&nbsp;you&nbsp;want&nbsp;to&nbsp;have&nbsp;available)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;/features&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;/plugins&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
部署结构如下图(<strong>转载</strong>):<br />
<br />
<br />
<img title="OSGi/Equinox部署在Servlet容器内" src="http://docs.google.com/File?id=ajb63mf8qh8d_111f4cv2s" alt="" style="height: 254px; width: 576px;" /><br />
<br />
个人感觉这个解决方案使用价值不大。<br />
<br />
<h3>解决方案二: Web服务器与Servlet容器嵌入在OSGi/Equinox</h3>
具体实现: 把Jetty当作一个插件嵌入到OSGi/Equinox中，并基于Jetty实现OSGi标准中的HTTP服务，其他插件可以通过该服务注册Servlet和静态页面。<br />
<br />
OSGi标准中的HTTP服务接口如下：<br />
<br />
<span style="color: rgb(102, 51, 255);"></span>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;org.osgi.service.http;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;javax.servlet.Servlet;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;javax.servlet.ServletException;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.util.Dictionary;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;HttpService&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;registerServlet(String&nbsp;alias,&nbsp;Servlet&nbsp;servlet,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dictionary&nbsp;initparams,&nbsp;HttpContext&nbsp;context)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throws</span><span>&nbsp;ServletException,&nbsp;NamespaceException;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;registerResources(String&nbsp;alias,&nbsp;String&nbsp;name,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpContext&nbsp;context)&nbsp;<span class="keyword">throws</span><span>&nbsp;NamespaceException;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;unregister(String&nbsp;alias);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;HttpContext&nbsp;createDefaultHttpContext();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
<br />
部署结构图(<span style="font-weight: bold;">转载</span>):<br />
<br />
<img title="嵌入Servlet容器到OSGi/Equinox中" src="http://docs.google.com/File?id=ajb63mf8qh8d_112hmf5js" alt="" style="height: 135px; width: 576px;" /><br />
<br />
因为OSGi是最早为嵌入式系统设计，所以OSGi标准中的HTTP服务只提供了有限的Servlet与静态资源的发布功能，没有一个完整的WEB容器概念，这种模式更适合通过WEB方式暴露(Export)服务，不太适合开发展现层的WEB应用。<br />
<br />
通过Equinox提供的扩展/扩展点功能可以简化这种方式WEB应用的开发，就是通过plugin.xml来配置Servlet和静态页面的注册。<br />
<br />
<h3>解决方案三: 设计适合OSGi环境的Servlet容器，构建纯插件体系结构的WEB层</h3>
具体实现：&quot;插件&quot;与我们通常所说软件&quot;模块&quot;的一个区别是：插件能自我描述，加载运行在插件容器中。那么，我们可以分层扩展一个插件的自我描述，用类似Decorator的模式为插件增加&ldquo;特征&rdquo;描述。 所以，我们在OpenCore中定义了三种特征的插件，如下图：<br />
<br />
<img src="http://docs.google.com/File?id=ajb63mf8qh8d_72f3ngnj" alt="" style="width: 191px; height: 116px;" /><br />
<br />
这三种插件类型间关系类似Decorator模式，从内到外增加&quot;特征&quot;描述：<br />
<ol>
    <li>     OSGi标准插件，自描述文件&quot;META-INF/MANIFEST.MF&quot;     </li>
    <li>       OpenCore插件，增加自描述文件&quot;META-INF/opencore.xml&quot;，实现符合OSGi环境的依赖注册(IoC)与动态扩展点       </li>
    <li>         OpenCore Web插件，增加自描述文件&quot;WEB-INF/web.xml&quot;(符合Servlet规范)，WEB特性的插件，可以部署在Servlet容器内</li>
</ol>
<br />
这样我们可以把一个应用的WEB层像业务层一样，分割为多个插件，部署在OSGi/Equinox的框架中.<br />
<br />
部署结构图:<br />
<br />
<img src="http://docs.google.com/File?id=ajb63mf8qh8d_73gnt2jc" alt="" style="width: 478px; height: 343px;" /> <br />
<br />
<br />
<img src="http://docs.google.com/File?id=ajb63mf8qh8d_74cssz7s" alt="" style="width: 513px; height: 347px;" /><br />
<br />
我 们觉得这种方式以合适的力度将WEB层分割为插件部署在OSGi框架上，充分的发挥了OSGi体系结构的强大之处，也提高了WEB层开发部署的灵活性。目 前，业界好像也有很多项目是采用这中方式部署。这种部署方式的缺点是，不得不修改Jetty容器的实现，以使其适应OSGi的环境，我们希望Jetty以 后能支持这个功能:)<br />
<br />
Google Code上发布了一个基于OpenCore的示例项目linktalk，一个基于GWT、Equinox、OpenCore的Ajax聊天室。<br />
<br style="font-family: Arial;" />
<span style="font-family: Arial;">项目地址: http://code.google.com/p/lintkalk<br />
<br style="font-family: Arial;" />
</span><span style="font-family: Arial;">源码下载: svn checkout https://linktalk.googlecode.com/svn/trunk/project<br />
<br />
程序下载: svn checkout https://linktalk.googlecode.com/svn/trunk/release<br />
<br />
</span>
<h3>相关资源:</h3>
<a href="http://www.eclipse.org/equinox/server/http_quickstart.php" target="_blank">http://www.eclipse.org/equinox/server/http_quickstart.php</a>  <span style="margin: 1em; font-size: 120%; font-family: Arial;"><span style="font-family: Arial;"></span><span style="margin: 1em; font-size: 120%; font-family: Arial;"></span><br style="font-family: Arial;" /></span>
          <br/>
          <span style="color:red;">
            <a href="http://EnterpriseArchitecture.group.javaeye.com/group/blog/50624#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Jan 2007 14:15:50 +0800</pubDate>
        <link>http://EnterpriseArchitecture.group.javaeye.com/group/blog/50624</link>
        <guid>http://EnterpriseArchitecture.group.javaeye.com/group/blog/50624</guid>
      </item>
      <item>
        <title>OpenCore: OSGi上实现IoC容器</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
          链接：<a href="http://EnterpriseArchitecture.group.javaeye.com/group/blog/43302" style="color:red;">http://EnterpriseArchitecture.group.javaeye.com/group/blog/43302</a>&nbsp;
          发表时间: 2007年01月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Martin Fowler有一篇文章里称：说一个面向对象系统框架或结构是基于IoC的，就好像说汽车有四个轮子一样。非常精辟 ，IoC或者DI更多的是一个设计原则，一个设计良好的面向对象的系统或多或少都有这方面的特点，这与是否有一个IoC容器的关系不大，IoC容器的作用 是简化开发，强制系统遵循IoC原则而已。<br />
<br />
OpenCore在最初设计的时候，没有考虑IoC容器的问题，主要是解决服务端的WEB开发、数据库访问、与REST远程通信等问题，我们完全使用 OSGi本身的服务注册机制，在插件启动时用代码实现依赖注射。直到今年8月份左右，我们把依赖注射的职责分离出来，在OSGi上实现了一个分级的IoC 容器，以简化开发，避免在插件启动类写依赖注射的代码。<br />
<br />
OpenCore IoC容器有下面几个特性：<br />
<ol>
    <li>完全基于OSGi的插件体系结构。</li>
    <li>     简单，远没有Spring IoC容器复杂，支持属性注射(Property Injection)与构造函数注册(Constructor Injection)。   </li>
    <li>     分级IoC容器，分为插件级、应用程序级、网络级   </li>
    <li>     IoC容器管理的服务与OSGi框架管理的服务可以互访，这样保证了OpenCore IoC不会屏蔽OSGi本身的模型，使得基于OpenCore IoC的插件与大量第三方基于完全基于OSGi服务模型的插件可以协作。</li>
    <li>支持通过动态扩展点实现1对多的依赖注册机制。<br />
    </li>
</ol>
OpenCore IoC的实现机制：<br />
<br />
1. 每个插件(bundle)增加一个IoC的自描述文件META-INF/OPENCORE.XML，例如org.opengoss.web.core中，该文件的配置如下：<br />
<font color="#3366ff"><br />
<font color="#0000ff">
<plugin id="WebCore" version="1.0"></plugin>
</font></font>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">plugin</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;WebCore&quot;</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">service</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;WebServerConfiguration&quot;</span><span>&nbsp;</span><span class="attribute">scope</span><span>=</span><span class="attribute-value">&quot;application&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.internal.WebServerConfiguration&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">interface</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.core.IWebServerConfiguration&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">service</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;MarshallerRegistry&quot;</span><span>&nbsp;</span><span class="attribute">scope</span><span>=</span><span class="attribute-value">&quot;application&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.internal.MarshallerRegistry&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">interface</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.service.IMarshallerRegistry&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">service</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;WSContainer&quot;</span><span>&nbsp;</span><span class="attribute">scope</span><span>=</span><span class="attribute-value">&quot;application&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.internal.WSContainer&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">interface</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.service.IWSContainer&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;marshallerRegistry&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;MarshallerRegistry&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">service</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;WSExporter&quot;</span><span>&nbsp;</span><span class="attribute">scope</span><span>=</span><span class="attribute-value">&quot;application&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.internal.WSExporter&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">interface</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;org.opengoss.web.service.IWSExporter&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">constructor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;WSContainer&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">constructor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">extension-point</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;Marshaller&quot;</span><span>&nbsp;</span><span class="attribute">target</span><span>=</span><span class="attribute-value">&quot;MarshallerRegistry&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">bindMethod</span><span>=</span><span class="attribute-value">&quot;addMarshaller&quot;</span><span>&nbsp;</span><span class="attribute">unbindMethod</span><span>=</span><span class="attribute-value">&quot;removeMarshaller&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">extension-point</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;WebService&quot;</span><span>&nbsp;</span><span class="attribute">target</span><span>=</span><span class="attribute-value">&quot;WSExporter&quot;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">bindMethod</span><span>=</span><span class="attribute-value">&quot;export&quot;</span><span>&nbsp;</span><span class="attribute">unbindMethod</span><span>=</span><span class="attribute-value">&quot;unexport&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">extension-point</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;Class&quot;</span><span>&nbsp;</span><span class="attribute">target</span><span>=</span><span class="attribute-value">&quot;MarshallerRegistry&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">bindMethod</span><span>=</span><span class="attribute-value">&quot;addAliasClass&quot;</span><span>&nbsp;</span><span class="attribute">unbindMethod</span><span>=</span><span class="attribute-value">&quot;removeAliasClass&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">plugin</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
2. 插件的激活类(Activator)不是直接实现OSGi本身的&quot;BundleActivator&quot;接口，而是继承由OpenCore提供的 &quot;org.opengoss.core.PluginActivator&quot;，启动时，PluginActivator负责完成XML文件解析与依赖注射。 例如org.opengoss.web.core中的Activator代码如下：<br />
<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.opengoss.core.IPluginContext;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.opengoss.core.PluginActivator;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;Plugin&nbsp;activator.</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;Ery&nbsp;Lee(ery.lee@gmail.com)</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@version&nbsp;1.0&nbsp;2006-11-20</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@since&nbsp;1.0</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Activator&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PluginActivator&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;startPlugin(IPluginContext&nbsp;pluginContext)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;stopPlugin(IPluginContext&nbsp;pluginContext)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
<br />
3. 我们注意到上的的服务配置中有&quot;scope&quot;的属性，该属性定义一个服务的使用范围，确定一个服务注册到哪一级IoC容器。<br />
<br />
4. 另外一点，我们在IoC基础上增加了动态扩展点功能，实现多对1的注射。<br />
<br />
OpenCore整个项目代码发布在www.sf.net/projects/opengoss与code.google.com/p/opengoss下。
          <br/>
          <span style="color:red;">
            <a href="http://EnterpriseArchitecture.group.javaeye.com/group/blog/43302#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Jan 2007 21:49:21 +0800</pubDate>
        <link>http://EnterpriseArchitecture.group.javaeye.com/group/blog/43302</link>
        <guid>http://EnterpriseArchitecture.group.javaeye.com/group/blog/43302</guid>
      </item>
  </channel>
</rss>