<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Tony's Home</title>
    <description></description>
    <link>http://ecsoftcn.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>XFire客户端流程分析</title>
        <author>ecsoftcn</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsoftcn.javaeye.com">ecsoftcn</a>&nbsp;
                    链接：<a href="http://ecsoftcn.javaeye.com/blog/166827" style="color:red;">http://ecsoftcn.javaeye.com/blog/166827</a>&nbsp;
          发表时间: 2008年03月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span>XFire</span><span style="font-family: 宋体">是当前</span><span>J2EE</span><span style="font-family: 宋体">领域非常流行的</span><span>Web Service</span><span style="font-family: 宋体">框架，以其卓越的性能和简单易用的特性博得了广大开发者的青睐。目前</span><span>XFire</span><span style="font-family: 宋体">已经演变为</span><span>Apache</span><span style="font-family: 宋体">的</span><span>CXF</span><span style="font-family: 宋体">项目，但仍有大量用户在使用</span><span>XFire</span><span style="font-family: 宋体">。</span></p><p>&nbsp;</p><p><a href="http://www.blogjava.net/hywavesoft/archive/2008/03/02/183262.html">http://www.blogjava.net/hywavesoft/archive/2008/03/02/183262.html</a></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://ecsoftcn.javaeye.com/blog/166827#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Mon, 03 Mar 2008 09:20:07 +0800</pubDate>
        <link>http://ecsoftcn.javaeye.com/blog/166827</link>
        <guid>http://ecsoftcn.javaeye.com/blog/166827</guid>
      </item>
          <item>
        <title>iBatis一级缓存的探讨 </title>
        <author>ecsoftcn</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsoftcn.javaeye.com">ecsoftcn</a>&nbsp;
                    链接：<a href="http://ecsoftcn.javaeye.com/blog/122364" style="color:red;">http://ecsoftcn.javaeye.com/blog/122364</a>&nbsp;
          发表时间: 2007年09月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial"><font face="Arial"><font size="2"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">前几天和朋友讨论数据库</span><span lang="EN-US">Cache</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的时候，谈到了</span><span lang="EN-US">iBatis</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架不支持一级缓存，后来尝试作了一些扩展来支持一级缓存，放出来大家探讨一下。</span></font></font></font></p>
<p><font face="Arial"><a href="http://blog.csdn.net/ecsoftcn/archive/2007/09/09/1777904.aspx">http://blog.csdn.net/ecsoftcn/archive/2007/09/09/1777904.aspx</a>&nbsp;</font></p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://ecsoftcn.javaeye.com/blog/122364#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Sun, 09 Sep 2007 11:41:18 +0800</pubDate>
        <link>http://ecsoftcn.javaeye.com/blog/122364</link>
        <guid>http://ecsoftcn.javaeye.com/blog/122364</guid>
      </item>
          <item>
        <title>Guice项目实战（一）</title>
        <author>ecsoftcn</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsoftcn.javaeye.com">ecsoftcn</a>&nbsp;
                    链接：<a href="http://ecsoftcn.javaeye.com/blog/78365" style="color:red;">http://ecsoftcn.javaeye.com/blog/78365</a>&nbsp;
          发表时间: 2007年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="center"><font size="4" face="Arial"><strong>引言</strong></font></p>
<font face="Arial">
<p align="left"><br />
<font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 公元二零零七年，开源领域各IoC框架战火不断。Spring大红大紫，独领风骚；PicoContainer、Hivemind紧随其后，穷追不舍。正当各路豪杰稳步发展之时，一匹黑马悄悄杀进江湖，这就是号称比Spring快100倍的Guice，从此江湖又起风云！</font></p>
<p><font size="3" face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Guice是由Bob lee设计的基于Java5 Annotation的轻量级IoC容器，它把组织对象依赖关系的逻辑从XML文件转移到对象内部，巧妙的实现了DI模式。本文并不打算详细讲解Guice的语法，如果你尚且不知道Guice是什么，可以先阅读附录中提供的文章了解Guice相关信息。本文余下部分将用一个以Guice为基础的简单的MVC模式的参考实现（实在是不知道应该叫什么，暂且就称之为参考实现吧）以及在该实现基础上开发的XXX示例来深入Guice应用开发实战。</font></p>
<font face="Arial">
<p><font size="3" face="Arial"><em>完整内容请参阅附件中的文档，以及AromaRI的实现代码。文档正在完善中&middot;&middot;&middot;</em></font></p>
<p><em><font size="3"></font></em></p>
<p><em><font size="2" color="#ff0000"><strong>附件AromaRI项目源码是一个完整的Eclipse工程，运行ant脚本可以编译、测试和打包web应用。</strong></font></em></p>
</font></font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://ecsoftcn.javaeye.com/blog/78365#comments" style="color:red;">已有 <strong>8</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 May 2007 01:29:00 +0800</pubDate>
        <link>http://ecsoftcn.javaeye.com/blog/78365</link>
        <guid>http://ecsoftcn.javaeye.com/blog/78365</guid>
      </item>
          <item>
        <title>iBatis框架batch处理问题分析及优化</title>
        <author>ecsoftcn</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsoftcn.javaeye.com">ecsoftcn</a>&nbsp;
                    链接：<a href="http://ecsoftcn.javaeye.com/blog/68962" style="color:red;">http://ecsoftcn.javaeye.com/blog/68962</a>&nbsp;
          发表时间: 2007年04月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          为什么要做batch处理 <br /><br />Oracle回滚段 <br /><br />在JDBC中如何做batch处理 <br /><br />iBatis框架对batch处理的支持 <br /><br />iBatis框架做batch处理的问题 <br /><br />修改底层代码，支持多表batch处理 <br /><br /><br />为什么要做batch处理&nbsp;&nbsp;&nbsp; <br /><br />&nbsp;&nbsp;&nbsp; 这个问题我就不解释了，因为我想你们肯定能比<br /><br />我解释的更好！如果你真的不知道，那就到Google上去搜<br /><br />索一下吧☻<br /><br />Oracle回滚段<br /><br />&nbsp;&nbsp;&nbsp; 这个问题偶也不很明白，只是大概有个了解，如<br /><br />果你是这方面的专家，或者对这方面有比较深的理解，<br /><br />别忘了跟偶分享哦☻<br /><br />在JDBC中如何做batch处理<br /><br />&nbsp;&nbsp;&nbsp; JDBC提供了数据库batch处理的能力，在数据大批量操作（新增、删除等）的情况下可以大幅度提升系统的性能。我以前接触的一个项目，在没有采用batch处理时，删除5万条数据大概要半个小时左右，后来对系统进行改造，采用了batch处理的方式，删除5万条数据基本上不会超过1分钟。看一段JDBC代码：<br /><br />// 关闭自动执行<br />con.setAutoCommit(false); <br />Statement stmt = con.createStatement(); <br /><br />stmt.addBatch("INSERT INTO employees VALUES (1000, 'Joe Jones')"); <br />stmt.addBatch("INSERT INTO departments VALUES (260, 'Shoe')"); <br />stmt.addBatch("INSERT INTO emp_dept VALUES (1000, 260)"); <br /><br />// 提交一批要执行的更新命令<br />int[] updateCounts = stmt.executeBatch(); <br /><br /><br /><br />&nbsp;&nbsp;&nbsp; 本例中禁用了自动执行模式，从而在调用 Statement.executeBatch() 时可以防止 JDBC 执行事务处理。禁用自动执行使得应用程序能够在发生错误及批处理中的某些命令不能执行时决定是否执行事务处理。因此，当进行批处理更新时，通常应该关闭自动执行。<br /><br />&nbsp;&nbsp;&nbsp; 在JDBC 2.0 中，Statement 对象能够记住可以一起提交执行的命令列表。创建语句时，与它关联的命令列表为空。Statement.addBatch() 方法为调用语句的命令列表添加一个元素。如果批处理中包含有试图返回结果集的命令，则当调用 Statement. executeBatch() 时，将抛出 SQLException。只有 DDL 和 DML 命令（它们只返回简单的更新计数）才能作为批处理的一部分来执行。如果应用程序决定不提交已经为某语句构<br />造的命令批处理，则可以调用方法 Statement.clearBatch()（以上没有显示）来重新设置批处理。<br /><br />&nbsp;&nbsp;&nbsp; Statement.executeBatch() 方法将把命令批处理提交给基本 DBMS 来执行。命令的执行将依照在批处理中的添加顺序来进行。ExecuteBatch() 为执行的命令返回更新计数数组。数组中对应于批处理中的每个命令都包含了一项，而数组中各元素依据命令的执行顺序（这还是和命令的最初添加顺序相同）来排序。调用executeBatch() 将关闭发出调用的 Statement 对象的当前结果集（如果有一个结果集是打开的）。executeBatch() 返回后，将重新将语句的内部批处理命令列表设置为空。<br /><br />&nbsp;&nbsp;&nbsp; 如果批处理中的某个命令无法正确执行，则 ExecuteBatch() 将抛出BatchUpdateException。可以调用BatchUpdateException.getUpdateCounts() 方法来为批处理中成功执行的命令返回更新计数的整型数组。因为当有第一个命令返回错误时，Statement.executeBatch() 就中止，而且这些命令是依据它们在批处理中的添加顺序而执行的。所以如果 BatchUpdateException.getUpdateCounts() 所返回的数组包含 N 个元素，这就意味着在调用 executeBatch() 时批处理中的前 N 个命令被成功执行。用PreparedStatement 可以象下面这样写代码：<br /><br /><br />// 关闭自动执行<br /><pre name="code" class="java">con.setAutoCommit(false); 
PreparedStatement stmt = con.prepareStatement("INSERT INTO employees VALUES (?, ?)"); 

stmt.setInt(1, 2000); 
stmt.setString(2, "Kelly Kaufmann"); 
stmt.addBatch(); 
??? </pre><br /><br />// 提交要执行的批处理<br /><pre name="code" class="java">int[] updateCounts = stmt.executeBatch(); </pre><br /><br /><br /><br />iBatis框架对batch处理的支持<br /><br />&nbsp;&nbsp;&nbsp; iBatis框架对batch处理提供了很好的支持，底层的实现方式就是JDBC。下面看一段示例代码：<br /><br /><br /><pre name="code" class="java">    private void execute(SqlMapClient client){ 
        if(log.isDebugEnabled()){ 
            log.debug("execute start..."); 
        } 

        client.startBatch(); 
         
        for(int i=0;i&lt;2000;i++){ 

            client.delete("delete from order where id=?",i); 
             
        } 

        client.executeBatch(); 

        if(log.isDebugEnabled()){ 
            log.debug("execute end..."); 
        } 
    } </pre><br /><br /><br />iBatis框架做batch处理的问题<br /><br />&nbsp;&nbsp;&nbsp; 在一个batch中只能对一个表进行操作，例如插入或删除。当有多个表需要处理时，只能放在多个batch中进行处理。看下面的一段代码：<br /><br /><pre name="code" class="java">    private void execute(int from,int to,List list){ 
        if(log.isDebugEnabled()){ 
            log.debug("STRGHousekeepTask execute start..."); 
        } 
        HKSqlMapWrapper sqlWrapper = HKSqlMapWrapper.newInstance(); 
        sqlWrapper.startBatch(); 
         
        for(int i=from;i&lt;to;i++){ 
            sqlWrapper.delete(STRGHousekeepConstants.DELETE_STRG_CNTR_BL,list.get(i)); 
            sqlWrapper.delete(STRGHousekeepConstants.DELETE_STRG_CNTR,list.get(i)); 
            sqlWrapper.delete(STRGHousekeepConstants.DELETE_CNTR,list.get(i)); 
        } 
        sqlWrapper.execBatch(); 
        if(log.isDebugEnabled()){ 
            log.debug("STRGHousekeepTask execute end..."); 
        } 
    } </pre><br />&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; 代码1<br /><br />&nbsp;&nbsp;&nbsp; 这段代码的目的就是要删除数据库中3个表的数据，sqlWrapper是iBatis的SqlMapClient的一个包装器，主要是封状对事物的控制。当批次（既to-from的值）很小的时候，这样写是没有问题的。尽管这段代码的本意是要享受batch处理带来的好处，但是事实上这段代码并不会真正达到预期的效果，至于原因，我们一会在进行分析☻。我们先来看下面一段代码：<br /><br /><pre name="code" class="java">    private void execute(int from,int to,List list){ 
        if(log.isDebugEnabled()){ 
            log.debug("STRGHousekeepTask execute start..."); 
        } 
        HKSqlMapWrapper sqlWrapper = HKSqlMapWrapper.newInstance(); 
        sqlWrapper.startBatch(); 
         
        for(int i=from;i&lt;to;i++){ 
            sqlWrapper.delete(STRGHousekeepConstants.DELETE_STRG_CNTR_BL,list.get(i)); 
        } 
        for(int i=from;i&lt;to;i++){ 
            sqlWrapper.delete(STRGHousekeepConstants.DELETE_STRG_CNTR,list.get(i)); 
        } 
        for(int i=from;i&lt;to;i++){ 
            sqlWrapper.delete(STRGHousekeepConstants.DELETE_CNTR,list.get(i)); 
        } 
        sqlWrapper.execBatch(); 
        if(log.isDebugEnabled()){ 
            log.debug("STRGHousekeepTask execute end..."); 
        } 
    } </pre><br /><br />&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; 代码2<br /><br />&nbsp;&nbsp;&nbsp; 正如你所看到的，和代码1相比它只是做了3次循环，每个循环执行一个表的操作。虽然麻烦，但是却真正的享受到了batch处理的好处！下面是时候解释一下这两段代码幕后的秘密了☻。<br />&nbsp;&nbsp;&nbsp; 在前面的章节里已经解释了JDBC如何做batch处理，如果还不清楚的话请查看前面的章节。要解释这两段代码里面的玄机，还得看一段代码☻下面的代码是从iBatis源码中提取的：<br /><br /><pre name="code" class="java">    public void addBatch(RequestScope request, Connection conn, String sql, Object[] parameters  ) { 
      PreparedStatement ps = null; 
      if (currentSql != null
          &amp;&amp; sql.hashCode() == currentSql.hashCode() 
          &amp;&amp; sql.length() == currentSql.length()) { 
        int last = statementList.size() - 1; 
        ps = (PreparedStatement) statementList.get(last); 
      } else { 
        ps = conn.prepareStatement(sql); 
        currentSql = sql; 
        statementList.add(ps); 
      } 
      request.getParameterMap().setParameters(request, ps, parameters); 
      ps.addBatch(); 
      size++; 
    } </pre><br /><br />&nbsp;&nbsp;&nbsp; 这就是iBatis中batch处理的做法，在这里不想对这段代码做一一解释，有兴趣的可以自己查看一下iBatis的源码，我们只关心它如何对一条语句进行处理。参数sql是要进行batch处理的语句，parameters是sql的参数列表，如果sql和实例变量currentSql相等，则从statementList列表里面得到一个PreparedStatement，然后进行batch处理，如果不等就新生成一个PreparedStatement对象，并把它加到statementList列表里面，并把当前sql的值附给currentSql，下次传递来sql的时候就会和这个新的currentSql比较。这就是为什么在一个循环里面只对一个表进行处理的原因了。如果在一个循环里面对多个表进行处理，每次传给addBatch方法的sql都是新的，都会生成一个新的PreparedStatement，所以也就享受不到batch处理带来的好处了！&nbsp;&nbsp;&nbsp; <br /><br />&nbsp;&nbsp; 按照代码1的方式执行程序，当batch size很小的时候尽管享受不到batch处理带来的好处，但是也不至于会出什么大问题，但是当batch size值很大的时候（我在程序中试验过1000-5000范围），数据库就会报错了！错误是"too many courses"，原因是每生成一个PreparedStatement实例，就会相应的生成一个course。假设batch size是5000，要删除10个表的数据，那么产生的course的数目就是5000*10=50000，这对数据库来说是不能接受<br />的，所以就会报错。<br /><br />&nbsp;&nbsp;&nbsp; 如果按照代码2的的方式写程序肯定是没有问题的，只会生成10个PreparedStatement实例，相应的也只会生成10个course，这样就真正的享受到了batch处理带来的好处。但是，作为一名“挑剔”的程序员，我们怎么能容忍这样的写法呢？明明一个循环就可以搞定，现在要分成10个循环来做，非但效率上存在问题，大量重复的代码也让我们的程序显得很没“水准”。<br /><br />&nbsp;&nbsp;&nbsp; 既然第一种方式不能享受batch处理带来的好处，并且还会出错，第二种方式代码又非常的丑陋，那么我们就得想个办法来解决这个问题了。请记住：解决问题的过程就是一种享受☻。<br /><br />修改底层代码，支持多表batch处理<br /><br />&nbsp;&nbsp;&nbsp; 既然出问题的地方找到了，那么解决它就很容易了。什么,你说还不知道问题出在哪？My God! Kill me ,pleale☻！ <br /><br />&nbsp;&nbsp;&nbsp; 在这里分享一下我的思路，把每次传近来的sql作为key、把生成的PreparedStatement实例作为value放在一个Map里以后每次传来sql时先判断在Map里有没有这个key，如果有就直接拿到它的value作为PreparedStatement实例，如果没有就新生成一个PreparedStatement实例并把它放到Map里。这样有几个sql就有几个PreparedStatement<br />实例，和写多个循环效果是一样的。但写一个循环会更爽☻！ <br /><br />后记：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一般的项目中做batch处理的地方似乎都是先取得一个条件列表list，然后直接根据这个list的大小作为batch　size做一个循环。如果你在这个循环里同时进行多个表的ＣＵＤ操作，那么这里就有一个安全隐患存在。当你的list不太大的时候，你怎么测试程序它都不会出问题，尽管可能会有执行效率上的问题，但是当突然有一天这个list变的很大的时候，你的程序可能就突然“罢工”了。 <br /><br />　　对于这个问题，我在上面的文档里提出了改进batch处理的方法，另外还有需要注意的一个问题就是这个list的大小的问题。如果这个list的size有可能会很大，那么我们应该考虑根据这个list的大小“分批”执行。因为并不是batch　size越大效果就越好，如果batch的size很大的话很可能产生效率和性能上的问题。至于这个batch　size的值为多少比较合适就没有一个固定的说法，这个可能要取决于你所使用的服务器和数据库的性能了，另外不同厂商的ＪＤＢＣ驱动也会有不同的性能表现，你可以向ＤＢＡ咨询相关的问题。 <br /><br />　　我们应该尽可能把问题扼杀在摇篮之中。除了改进iＢatis的batch处理机智外，还应该适当的规划batch　size大小，以避免发生问题，提高执行效率。
          <br/><br/>
          <span style="color:red;">
            <a href="http://ecsoftcn.javaeye.com/blog/68962#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Sun, 08 Apr 2007 02:49:21 +0800</pubDate>
        <link>http://ecsoftcn.javaeye.com/blog/68962</link>
        <guid>http://ecsoftcn.javaeye.com/blog/68962</guid>
      </item>
          <item>
        <title>关于远程调用（XFire/HttpInvoker/Hessian etc.）及远程服务管理的一些随想（下）</title>
        <author>ecsoftcn</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsoftcn.javaeye.com">ecsoftcn</a>&nbsp;
                    链接：<a href="http://ecsoftcn.javaeye.com/blog/60689" style="color:red;">http://ecsoftcn.javaeye.com/blog/60689</a>&nbsp;
          发表时间: 2007年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">服务代理生成器（</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ServiceProxyGenerator</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">）也是一个值得一提的地方，我们先看一下它的接口：</span></p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">/**&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;服务代理生成器。&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;@author&nbsp;Tony&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;ServiceProxyGenerator&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp; </span>&nbsp; </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;取得服务代理对象。&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;serviceClass&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;服务接口&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;serviceUrl&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;服务地址&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;props&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;附加属性&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;代理对象&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;Exception&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;getService(Class&nbsp;serviceClass,&nbsp;String&nbsp;serviceUrl,&nbsp;Properties&nbsp;props)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">/*它只有一个&nbsp;getService()&nbsp;方法，那么为什么设计这个接口？在什么地方使用呢？回答这个问题之前先来看看下面这段代码：&nbsp;*/</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;registService(ServiceModel&nbsp;serviceModel)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;ServiceException&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&middot;&middot;&middot;&middot;&middot;&middot;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;serviceModel.getServiceId()&nbsp;+&nbsp;KEY_SPAR&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;serviceModel.getServiceClass().getName();&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(&nbsp;serviceNames&nbsp;.contains(key))&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;ServiceRegistException(&nbsp;</span><span class="string">&quot;service&nbsp;is&nbsp;exist!&quot;</span><span>&nbsp;);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;proxy&nbsp;=&nbsp;</span><span class="keyword">null</span><span>&nbsp;;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServiceProxyGenerator&nbsp;proxyGenerator&nbsp;=&nbsp;(ServiceProxyGenerator)&nbsp;beanFactory&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getBean(serviceModel.getServiceType()&nbsp;+&nbsp;PROXY_GENERATOR_END&nbsp;);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy&nbsp;=&nbsp;proxyGenerator.getService(serviceModel.getServiceClass(),&nbsp;serviceModel&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getServiceUrl(),&nbsp;serviceModel.getProps());&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;ServiceRegistException(&nbsp;</span><span class="string">&quot;can't&nbsp;regist&nbsp;service&nbsp;!&quot;</span><span>&nbsp;,&nbsp;e);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(proxy&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serviceNames&nbsp;.add(key);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serviceContainer&nbsp;.put(key,&nbsp;proxy);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;ServiceRegistException(&nbsp;</span><span class="string">&quot;fail&nbsp;to&nbsp;regist&nbsp;service&nbsp;!&quot;</span><span>&nbsp;);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%">&nbsp;<span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">上面做特殊标记的代码就是应用服务代理生成器的地方，这里我们用到了</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Spring</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">的</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">bean</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">工厂，根据注册服务的类型（</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">xfire,httpinvoker,hessian</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">等）到</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Spring</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">容器里查找相应的生成器，并生成指定类型的服务。看下面配置的几个服务代理生成器：</span></p>
<div class="code_title">xml 代码</div>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="comments"><!-- XFire 类型服务代理生成器 --></span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;xfire_generator&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;com.tonysoft.common.service.repository.generator.XFireServiceProxyGenerator&quot;</span><span>&nbsp;</span><span class="attribute">lazy-init</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;serviceFactory&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;xfire.serviceFactory&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;</span><span class="comments"><!-- Hessian 类型服务代理生成器 --></span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;hessian_generator&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;com.tonysoft.common.service.repository.generator.HessianServiceProxyGenerator&quot;</span><span>&nbsp;</span><span class="attribute">lazy-init</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;</span><span class="comments"><!-- HttpInvoker 类型服务代理生成器 --></span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;httpinvoker_generator&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;com.tonysoft.common.service.repository.generator.HttpInvokeServiceProxyGenerator&quot;</span><span>&nbsp;</span><span class="attribute">lazy-init</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;</span><span class="comments"><!-- 自定义 类型服务代理生成器 --></span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;custom_generator&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;com.tonysoft.common.service.repository.generator.CustomServiceProxyGenerator&quot;</span><span>&nbsp;</span><span class="attribute">lazy-init</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;</span><span class="comments"><!-- 服务中心（资源库） --></span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;serviceRepository&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;com.tonysoft.common.service.repository.DefaultServiceRepository&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;</span><span class="comments"><!-- 服务 ID 提供者 --></span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;serviceIdProvider&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;com.tonysoft.common.service.repository.provider.DefaultServiceIdProvider&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;</span><span class="comments"><!-- 所有远程服务的基础类 --></span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;abstractServiceProxyFactory&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;com.tonysoft.common.service.repository.ServiceProxyFactory&quot;</span><span>&nbsp;</span><span class="attribute">abstract</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">简单看一下</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">HttpInvoker</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">类型服务代理生成器的代码：</span> </o:p></span></p>
<div class="code_title">java 代码</div>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;HttpInvokeServiceProxyGenerator&nbsp;</span><span class="keyword">implements</span><span>&nbsp;ServiceProxyGenerator&nbsp;{&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp;HttpInvoker&nbsp;服务代理工厂&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;HttpInvokerProxyFactoryBean&nbsp;httpInvokerFactory&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HttpInvokerProxyFactoryBean();&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*&nbsp; </span>&nbsp; </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;com.alipay.xfiredemo.common.ServiceProxyGenerator#getService(java.lang.Class,&nbsp;java.lang.String,&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.util.Properties)&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;getService(Class&nbsp;serviceClass,&nbsp;String&nbsp;serviceUrl,&nbsp;Properties&nbsp;props)&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Todo&nbsp;initial&nbsp;httpInvokerFactory&nbsp;with&nbsp;props&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpInvokerFactory&nbsp;.setServiceInterface(serviceClass);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpInvokerFactory&nbsp;.setServiceUrl(serviceUrl);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;must&nbsp;invoke&nbsp;this&nbsp;method&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpInvokerFactory&nbsp;.afterPropertiesSet();&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;httpInvokerFactory&nbsp;.getObject();&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp; &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是的，正如你所看到的一样，我们这里把真正生成服务代理的任务交给了</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%">Spring</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span> <span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">HttpInvokerProxyFactoryBean</span> <span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt">来完成。</span> <span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 125%"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p>&nbsp;</o:p> </span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">提供在初始化时注册的静态服务功能，配制如下：</span> </p>
<div class="code_title"><span><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag">
<div class="code_title">
<div class="code_title">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="comments"><!-- 初始化时注册的静态服务 --></span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;bootupServiceRegister&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;com.tonysoft.common.service.repository.register.BootupServiceRegister&quot;</span><span>&nbsp;</span><span class="attribute">lazy-init</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;services&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">list</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">class</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;com.tonysoft.common.service.repository.ServiceModel&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;serviceClass&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;com.tonysoft.common.service.repository.example.HelloHttpInvoker&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;serviceId&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;default&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;serviceType&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;httpinvoker&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;serviceUrl&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;http://localhost:8080/serviceRepositoryApplication/service/httpInvoker/helloHttpInvoker.service&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;props&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">props</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">props</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">class</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;com.tonysoft.common.service.repository.ServiceModel&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;serviceClass&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;com.tonysoft.common.service.repository.example.HelloXFire&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;serviceId&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;default&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;serviceType&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;xfire&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;serviceUrl&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;http://localhost:8080/serviceRepositoryApplication/service/xfire/helloXFire.service?WSDL&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;props&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">props</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">props</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">list</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
</ol>
</div>
</div>
<span><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
<div class="code_title"></div>
<span><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"><span class="tag"></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">具体内容可以参看附件中的资源：</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -24pt; LINE-HEIGHT: 125%; mso-list: l0 level1 lfo2; tab-stops: list 45.0pt"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">一、</span> </span><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ServiceRepository</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">的源代码（</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Eclipse</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">工程）</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -24pt; LINE-HEIGHT: 125%; mso-list: l0 level1 lfo2; tab-stops: list 45.0pt"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">二、</span> </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">一个示例应用</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -24pt; LINE-HEIGHT: 125%; mso-list: l0 level1 lfo2; tab-stops: list 45.0pt"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">三、</span> </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">打包部署的</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ANT</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">脚本</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 125%"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p>&nbsp;</o:p> </span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">把项目导入</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Eclipse</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">中，直接运行</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Ant</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">脚本，在</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">target</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">目录下会生成服务中心的</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">jar</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">包，同时生成示例应用的</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">war</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">包，把</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">war</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">包放到任意服务器（</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Server</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">）上并启动服务器并确保应用正常启动。</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行</span> <span lang="EN-US" style="FONT-SIZE: 12pt; BACKGROUND: silver; COLOR: black; LINE-HEIGHT: 125%; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: silver">ServiceRepositoryTest</span> <span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">.java</span> <span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt">执行完整的单元测试，观测结果。其他的自己看源码吧。</span></p>
<p>&nbsp;</p>
<div class="code_title">
<p><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt"><font face="Arial"><a href="http://www.javaeye.com/topic/60681" target="_blank">关于远程调用（XFire/HttpInvoker/Hessian etc.）及远程服务管理的一些随想（上）</a></font></span></p>
<p><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt"><font face="Arial"><a href="http://www.javaeye.com/topic/60687" target="_blank">关于远程调用（XFire/HttpInvoker/Hessian etc.）及远程服务管理的一些随想（中）</a></font></span></span></p>
<p><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt"></span></span></p>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://ecsoftcn.javaeye.com/blog/60689#comments" style="color:red;">已有 <strong>8</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Sun, 18 Mar 2007 12:56:28 +0800</pubDate>
        <link>http://ecsoftcn.javaeye.com/blog/60689</link>
        <guid>http://ecsoftcn.javaeye.com/blog/60689</guid>
      </item>
          <item>
        <title>关于远程调用（XFire/HttpInvoker/Hessian etc.）及远程服务管理的一些随想（中）</title>
        <author>ecsoftcn</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsoftcn.javaeye.com">ecsoftcn</a>&nbsp;
                    链接：<a href="http://ecsoftcn.javaeye.com/blog/60687" style="color:red;">http://ecsoftcn.javaeye.com/blog/60687</a>&nbsp;
          发表时间: 2007年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt"></span></p>
<div class="code_title">
<div class="code_title">尽管服务池解决了一些问题，在某种程度上降低了复杂度，但仍存在如下一些问题：</div>
</div>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 125%; mso-list: l0 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore"><img src="file:///C:/DOCUME~1/TAOYOU~1.ALI/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" height="13" alt="*" width="13" /> <span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">服务的运行期动态注册</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 125%; mso-list: l0 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore"><img src="file:///C:/DOCUME~1/TAOYOU~1.ALI/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" height="13" alt="*" width="13" /> <span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">服务的自动注入（</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">IoC</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">）</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 125%; mso-list: l0 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore"><img src="file:///C:/DOCUME~1/TAOYOU~1.ALI/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" height="13" alt="*" width="13" /> <span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">透明化服务</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ID</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">的传递</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 125%"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p>&nbsp;</o:p> </span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">在服务池（</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ServicePool</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">）概念的基础上进行扩展，我们得出了如下的系统模型：</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%">
<table cellspacing="0" border="0" summary="" width="100%" cellpadding="0">
    <tbody>
        <tr>
            <td><img src="http://www.blogjava.net/images/blogjava_net/hywavesoft/5589/o_ServiceRepository.PNG" alt="" />&nbsp;</td>
        </tr>
    </tbody>
</table>
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">在核心位置上是一个服务中心资源库（</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ServiceRepository</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">），存储了系统中用到的所有的远程服务。服务采取动态注册的机制，由对外提供的服务注册器（</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ServiceRegister</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">）提供服务注册功能。外部系统可以实现该接口向资源中心注册服务。提供了一个启动时运行的注册器，可以把静态配置在系统中的服务都注册进来。</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 125%"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p>&nbsp;</o:p> </span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 125%"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">服务的生成、管理等均由服务中心自己维护，委托服务代理生成器（</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ServiceProxyGenerator</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">）完成服务的创建。可以针对现有的远程调用方式，如</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">XFire,HttpInvoker,Hessian</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">等创建服务代理，也可以针对自己定义的远程调用方式创建服务代理，由</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US">CustomServiceProxyGenerator </span></strong></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">完成该功能。</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 125%"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">一个服务模型包括</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">5</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">个因素：</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 125%; mso-list: l1 level1 lfo1; tab-stops: list 63.0pt"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore"><img src="file:///C:/DOCUME~1/TAOYOU~1.ALI/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" height="13" alt="*" width="13" /> <span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">服务接口</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">serviceClass<o:p></o:p></span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 125%; mso-list: l1 level1 lfo1; tab-stops: list 63.0pt"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore"><img src="file:///C:/DOCUME~1/TAOYOU~1.ALI/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" height="13" alt="*" width="13" /> <span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">服务</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ID serviceId<o:p></o:p></span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 125%; mso-list: l1 level1 lfo1; tab-stops: list 63.0pt"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore"><img src="file:///C:/DOCUME~1/TAOYOU~1.ALI/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" height="13" alt="*" width="13" /> <span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">服务类型</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">serviceType<o:p></o:p></span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 125%; mso-list: l1 level1 lfo1; tab-stops: list 63.0pt"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore"><img src="file:///C:/DOCUME~1/TAOYOU~1.ALI/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" height="13" alt="*" width="13" /> <span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">服务地址</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">serviceUrl<o:p></o:p></span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 125%; mso-list: l1 level1 lfo1; tab-stops: list 63.0pt"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore"><img src="file:///C:/DOCUME~1/TAOYOU~1.ALI/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" height="13" alt="*" width="13" /> <span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">附加属性</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">props<o:p></o:p></span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">查找一个服务需要两个因素，一个是服务接口，另一个是服务</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ID</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">。这两个因素共同决定了一个服务，既服务中心内部的&ldquo;服务</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ID</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">&rdquo;。通过这种方式，可以允许存在多个</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ID</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">相同但接口不同的服务，也可以存在多个接口相同但</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ID</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">不同的服务。</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p>&nbsp;</o:p> </span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">服务</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ID</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">的获取是系统中一个关键的功能，这部分对程序员来说应该是透明的，由系统自己维护。相应的提供了一个服务</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ID</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">提供者</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">(ServiceIdProvider)</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">接口，由实现该接口的子类完成服务</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ID</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">获取功能（这是比较关键的地方，需要特殊考虑）。</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p>&nbsp;</o:p> </span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">对于程序员来说，使用服务中心里的服务再也不能比这样再简单了！看看配置：</span></p>
<div class="code_title">xml 代码</div>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;helloHttpInvokerService&quot;</span><span>&nbsp;</span><span class="attribute">parent</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;abstractServiceProxyFactory&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;serviceInterface&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;com.tonysoft.common.service.repository.example.HelloHttpInvoker&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">value</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;</span><span class="tag"><span>&nbsp;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">再看如何使用这个</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">bean</span>&nbsp;&nbsp;<span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">：</span> </p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">private</span><span>&nbsp;HelloHttpInvoker&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helloHttpInvokerService&nbsp;;&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testHttpInvoker()&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertNotNull(&nbsp;</span><span class="string">&quot;helloHttpInvokerService&nbsp;can't&nbsp;be&nbsp;null&nbsp;!&quot;</span><span>&nbsp;,&nbsp;helloHttpInvokerService&nbsp;);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals&nbsp;(&nbsp;</span><span class="string">&quot;Hello&nbsp;,&nbsp;HttpInvoker&nbsp;!&quot;</span><span>&nbsp;,&nbsp;helloHttpInvokerService&nbsp;.sayHello());&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp; </span>&nbsp; </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;helloHttpInvokerService&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;helloHttpInvokerService&nbsp;to&nbsp;set&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setHelloHttpInvokerService(HelloHttpInvoker&nbsp;helloHttpInvokerService)&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>&nbsp;.&nbsp;helloHttpInvokerService&nbsp;=&nbsp;helloHttpInvokerService;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">就是这样的简单！</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Spring</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">会把这个</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">bean</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">自动注入到程序中，可以象使用其他任何</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">bean</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">一样使用它！程序员完全不用关心该服务由谁提供、采用什么技术，他只要知道系统中存在这样一个服务就</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">OK</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">了。该技术彻底向程序员屏蔽了底层技术的实现细节，以统一的方式访问任何形式的远程服务。至于服务是如何生成、如何配置的将在后面叙述。</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p>&nbsp;</o:p> </span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">服务（</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Service Bean</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">）是如何实现自动注入（</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">IoC</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">）的呢？</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">注意到上面配置的</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">bean</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">都继承了&ldquo;</span> <span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; LINE-HEIGHT: 125%; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">abstractServiceProxyFactory</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">&rdquo;，它是一个工厂</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">bean</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">，负责根据给定的接口类型，到服务中心（</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ServiceRepository</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">）查找服务，并生成服务代理。我们来看一下它的核心代码：</span></p>
<div class="code_title">java 代码</div>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%">&nbsp;</p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">/**&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;服务代理工厂。&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;
    <p>&nbsp; </p>
    </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;该工厂对程序员屏蔽了服务实现的技术细节，对于&nbsp;XFire&nbsp;、&nbsp;Hessian&nbsp;、&nbsp;HttpInvoker&nbsp;等常用远程服务形式进行封装。&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;
    <p>&nbsp; </p>
    </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;程序员只需要提供一个服务接口（契约），该工厂会从服务中心&nbsp;<code>&nbsp;ServiceRepository&nbsp;</code>&nbsp;中查找符合该接口的远程服务实例。&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;
    <p>&nbsp; </p>
    </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;查找的规则是由服务&nbsp;ID&nbsp;提供者所提供的服务&nbsp;ID&nbsp;和服务接口名字共同组成的服务关键字匹配。&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;@author&nbsp;Tony&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ServiceProxyFactory&nbsp;</span><span class="keyword">implements</span><span>&nbsp;FactoryBean&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp;服务中心&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;ServiceRepository&nbsp;serviceRepository&nbsp;;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp;服务&nbsp;ID&nbsp;提供者&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;ServiceIdProvider&nbsp;serviceIdProvider&nbsp;;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp;服务接口&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serviceInterface&nbsp;;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp; </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.springframework.beans.factory.FactoryBean#getObject()&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;getObject()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;ProxyFactory.getProxy(getObjectType(),&nbsp;</span><span class="keyword">new</span><span>&nbsp;ServiceProxyInterceptor());&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;serviceRepository.getService(serviceInterface,&nbsp;serviceIdProvider.getCurrentServiceId());&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp; </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.springframework.beans.factory.FactoryBean#getObjectType()&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Class&nbsp;getObjectType()&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;serviceInterface&nbsp;;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*&nbsp; </span>&nbsp; </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.springframework.beans.factory.FactoryBean#isSingleton()&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;isSingleton()&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*&nbsp; </span>&nbsp; </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;远程服务代理拦截器。&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ServiceProxyInterceptor&nbsp;</span><span class="keyword">implements</span><span>&nbsp;MethodInterceptor&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*&nbsp; </span>&nbsp; </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;invoke(MethodInvocation&nbsp;invocation)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Throwable&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method&nbsp;=&nbsp;invocation.getMethod();&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;args&nbsp;=&nbsp;invocation.getArguments();&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;client&nbsp;=&nbsp;getClient();&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;method.invoke(client,&nbsp;args);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Object&nbsp;getClient()&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;serviceRepository&nbsp;.getService(&nbsp;serviceInterface&nbsp;,&nbsp;serviceIdProvider&nbsp;.getCurrentServiceId());&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(ServiceException&nbsp;e)&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>&nbsp;;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;----&nbsp;容器自动注入&nbsp;----&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&middot;&middot;&middot;&middot;&middot;&middot;&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">真正的魅力就在这个地方。根据服务接口类型和服务</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ID</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">，从服务中心获取特定的服务。服务接口是配置好的，</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"></span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">而服务</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ID</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">则在运行时才能确定，根据不同的应用、不同的策略提供不同的</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ServiceIdProvider</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">。其中用到了</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Spring</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">的</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">FactoryBean</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">和拦截器，至于为什么要在这里使用拦截器，可以参考</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Spring</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">框架的源码。</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p>&nbsp;</o:p> </span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%">&nbsp;</p>
<p><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt"><font face="Arial"><a href="http://www.javaeye.com/topic/60681" target="_blank">关于远程调用（XFire/HttpInvoker/Hessian etc.）及远程服务管理的一些随想（上）</a></font></span></p>
<p><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt"><font face="Arial"><a href="http://www.javaeye.com/topic/60689" target="_blank">关于远程调用（XFire/HttpInvoker/Hessian etc.）及远程服务管理的一些随想（下）</a></font></span></span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://ecsoftcn.javaeye.com/blog/60687#comments" style="color:red;">已有 <strong>6</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Sun, 18 Mar 2007 12:45:40 +0800</pubDate>
        <link>http://ecsoftcn.javaeye.com/blog/60687</link>
        <guid>http://ecsoftcn.javaeye.com/blog/60687</guid>
      </item>
          <item>
        <title>关于远程调用（XFire/HttpInvoker/Hessian etc.）及远程服务管理的一些随想（上）</title>
        <author>ecsoftcn</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsoftcn.javaeye.com">ecsoftcn</a>&nbsp;
                    链接：<a href="http://ecsoftcn.javaeye.com/blog/60681" style="color:red;">http://ecsoftcn.javaeye.com/blog/60681</a>&nbsp;
          发表时间: 2007年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">
<div class="code_title"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%; mso-outline-level: 1"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">在现代</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">J2EE</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">企业应用系统中，存在着</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Hessian</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">、</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">HttpInvoker</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">、</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">XFire</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">、</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Axis</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">等多种形式的远程调用技术。尽管有</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Spring</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">等框架对这些技术进行了封装，降低了使用的复杂度，但对普通程序员而言仍是复杂的&mdash;&mdash;至少需要要掌握这些技术的基础知识。</span> </p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%; mso-outline-level: 1"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
</span></div>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%; mso-outline-level: 1"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">无论使用那种技术，其基本原理都是一样的：服务端生成骨架，对外暴露服务；客户端生成服务代理，访问调用服务。通常情况下，生成服务代理的代价比较高昂，这也是我们第一次访问远程服务速度比较慢的原因，为每个请求生成新的服务代理恐怕不是我们所期望的。更何况，如果采用这种方式，就要在代码里针对各种不同的技术（如</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">XFire</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">、</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">HttpInvoker</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">）编写不同的服务生成和调用的处理代码。不仅麻烦，而且容易出错。我想，没有人愿意去直接操作各种框架技术的底层代码，这并不是一个好注意！</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%; mso-outline-level: 1"><span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt"><o:p>&nbsp;</o:p> </span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">作为一种替代方案，我们设计了一个&ldquo;服务池&rdquo;的功能，或者说&ldquo;服务工厂&rdquo;更贴切一点。先看下面这张类图：</span></p>
<span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%">
<table cellspacing="0" border="0" summary="" width="100%" cellpadding="0">
    <tbody>
        <tr>
            <td><img src="http://www.blogjava.net/images/blogjava_net/hywavesoft/5589/o_Remote%20Service%20Pool%20Framework%20V2.0.PNG" alt="" /></td>
        </tr>
    </tbody>
</table>
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 125%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">如上图所示，针对</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">HttpInvoker</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">、</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">XFire</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">、</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Hessian</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">等各种远程调用技术，抽象出一个&ldquo;远程服务池&rdquo;（服务工厂）既</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">RemoteServicePool</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">接口。该接口提供了获取服务及一些其他的辅助功能，并针对</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">HttpInvoker</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">、</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">XFire</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">、</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">Hessian</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">等不同技术提供了相应的具体实现。采用这种方式，开发人员只需在代码中&ldquo;注入&rdquo;</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">RemoteServicePool</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">，并以统一的方式（如</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">getService()</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">）获取实际的服务，只是针对不同技术在配置上有些须差异而已。该技术的原理非常简单，在应用启动之前把所有存在的服务提供者提供的服务都配置好，并为它们分配一个唯一的</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ID</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">。应用启动之后，框架会自动生成和这些地址相对应的服务代理（</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; mso-bidi-font-size: 10.0pt">ServiceProxy</span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 125%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-famil