<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>guoyaxin895</title>
    <description></description>
    <link>http://guoyaxin895.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>(转)王石者，广西柳州人氏</title>
        <author>guoyaxin895</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://guoyaxin895.javaeye.com">guoyaxin895</a>&nbsp;
                    链接：<a href="http://guoyaxin895.javaeye.com/blog/196798" style="color:red;">http://guoyaxin895.javaeye.com/blog/196798</a>&nbsp;
          发表时间: 2008年05月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small;">&nbsp;&nbsp;&nbsp; 王石者，广西柳州人氏。其母戎狄也，故性悍。少有异志，及长，经营房产为业，竟积身家亿万。石好登山，每出，必耗资巨万；其行小善一事，必刻石以记，好自作传记，开博客，延枪手，其所售房产多巨幅书其事，图其影，以为宣传，其好名如此。石有生之年,力主中国房产高价，平者几为房奴，及三代勉强还清者十之有八。 <br />&nbsp;&nbsp;&nbsp; 和谐年间，川中汶川大震，死伤逾二十万，房屋俱毁，祸及数百里，灾民不绝于道，号呼动于天地，举国哀悼。庙堂之上者，引车卖浆之下者，莫不解囊，慷概相助，中华竟因此隐隐而有复兴之象焉。然石出二百万，众皆责之，谓其为富不仁。或诘问：公，国之巨富。太平时，登珠峰跨南极，逞一己之私欲，穷百万之民膏，未尝见公有惜金之意；今值国家危难，黎庶倒悬之际，公退避三舍，独怜阿堵，此岂非&lsquo;宁可我负天下人，莫教天下人负我&rsquo;也？石辩曰：灾降中国乃常事也，吾留余钱以备后用。又曰：济民赈灾，人所自愿，岂能强我所难？四月十二日，御驾亲赴川中救灾，忽有闻，石已通工部侍郎及川道相关员，言谈间已定灾后重建计矣。<br />　&nbsp;&nbsp; 太史公曰商贾之道，固无利不起，然亦有道义存焉。时富豪和黄李氏，台塑王氏，江苏陈氏者，无不倾资以救国难，贩夫走卒、乞儿戏子，踊跃救难者，一一难书。国难当头，石前发冷言于公众，后谋私利于暗室，不亦鄙乎？时有人讽石曰：公可跨世界高山，可跨汶川一坟乎？道义不存而富，是为为富不仁也。众曰：做人不能太王石</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://guoyaxin895.javaeye.com/blog/196798#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/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>Sun, 25 May 2008 22:41:29 +0800</pubDate>
        <link>http://guoyaxin895.javaeye.com/blog/196798</link>
        <guid>http://guoyaxin895.javaeye.com/blog/196798</guid>
      </item>
          <item>
        <title>(转)JBoss，Geronimo还是Tomcat？</title>
        <author>guoyaxin895</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://guoyaxin895.javaeye.com">guoyaxin895</a>&nbsp;
                    链接：<a href="http://guoyaxin895.javaeye.com/blog/194777" style="color:red;">http://guoyaxin895.javaeye.com/blog/194777</a>&nbsp;
          发表时间: 2008年05月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h4><span style="font-size: small;">转自：<a href="http://www.matrix.org.cn/resource/article/2008-01-02/0bfeffb6-b8e3-11dc-ad9e-410871b898d3.html">http://www.matrix.org.cn/resource/article/2008-01-02/0bfeffb6-b8e3-11dc-ad9e-410871b898d3.html</a></span></h4>
<h4><span style="font-size: small;">摘要:</span></h4>
<p><span style="font-size: small;">像JBoss、Tomcat和Apache Geronimo这样的开源Java EE应用服务器轻松地立足于同类商业产品之中，并且真正地在技术革新中处于市场领先地位。但是这些开源Java EE应用服务器并不完全等同。在这篇文章中作者将从特性、部署和性能方面对JBoss 4.2，Geronimo 2和Tomcat 6三种服务器进行了比较。 </span></p>
<p><span style="font-size: small;"><strong><span style="font-size: 14px;"><span style="color: red;">JBoss，Geronimo还是Tomcat？<br />&mdash;&mdash;三种开源Java应用服务器的比较</span></span><br /><br />作者：Jonathan Campbell</strong><br /><br /><strong>译者：李功健</strong><br /><br /><strong>原文：</strong></span><a href="http://www.javaworld.com/javaworld/jw-12-2007/jw-12-appservers.html" target="_blank"><span style="font-size: small;">http://www.javaworld.com/javaworld/jw-12-2007/jw-12-appservers.html</span></a><br /><br /><br /><span style="font-size: small;"><strong><span style="font-size: 14px;"><span style="color: blue;">目录</span></span></strong><br /><br /></span></p>
<pre class="overflow"><span style="font-size: small;">1. Java企业特性比较

    1.1. Java EE 5兼容性
    1.2. EJB 3（企业JavaBeans技术）能力
    1.3. JSP 2.1和Servlet 2.5能力
    1.4. JSF 1.2支持
    1.5. 定制化插件支持
    1.6. 业务规则引擎支持
    1.7. Hibernate 3.x支持
    1.8. JBoss Seam支持
    1.9. 集群支持
    1.10. Eclipse IDE支持

2. 安装与部署

    2.1. 部署

3. 性能基准
4. 结论
5. 作者自传
6. 关于译者
</span></pre>
<p><br /><br /><span style="font-size: small;"><strong><span style="font-size: 14px;"><span style="color: blue;">概述</span></span></strong><br /><br />像JBoss、 Tomcat和Apache Geronimo这样的开源Java EE应用服务器轻松地立足于同类商业产品之中，并且真正地在技术革新中处于市场领先地位。但是这些开源Java EE应用服务器并不完全等同。在这篇文章中，我将从特性、部署和性能方面对</span><a href="http://www.jboss.org/products/jbossas/" target="_new"><span style="font-size: small;">JBoss 4.2</span></a><span style="font-size: small;">，</span><a href="http://geronimo.apache.org/" target="_new"><span style="font-size: small;">Geronimo 2</span></a><span style="font-size: small;">和</span><a href="http://tomcat.apache.org/" target="_new"><span style="font-size: small;">Tomcat 6</span></a><span style="font-size: small;">三种服务器进行了比较。<br /><br />当涉及到企业级应用开发时，Java企业版（Java EE）应用服务器被视为Web开发的标准。虽然有商业产品可供选择，但研究表明开源已经成为</span><a href="http://www.javaworld.com/javaworld/jw-12-2007/jw-12-appservers.html#resources" target="_new"><span style="font-size: small;">企业IT基础设施</span></a><span style="font-size: small;">中熟悉的一部分。JBoss 4.2，Geronimo 2和Tomcat 6是3 种被广泛使用的开源的Java EE服务器。在它们之中，尽管JBoos和Tomcat都没有和Java EE完全兼容，但它们仍然保有主要的市场。与此同时，具有完全Java EE兼容性的Geronimo正迅速呈现出强劲的势头。如果你想在Java EE的职业市场中取得竞争优势，你就应该熟悉上述3种开放源代码的服务器，并了解它们之间的不同。<br /><br />在本文中，我会在特性、部署和性能方面比较这三种领先的开源Java应用服务器。并且解释为什么在每种应用服务器有多种多样的不同特性，同时也提供一些对如哪种服务器更适合你的企业架构的调查。我在这里发表的讨论包括来自Red Hat的Chantal Yang和Apache软件基金会的评论。<br /><br /><strong><span style="font-size: 14px;"><span style="color: blue;">1. Java企业特性比较</span></span></strong><br /><br />表1提供了JBoss 4.2、Tomcat 6和Geronimo 2在实现Java EE功能特性方面的快速比较。请注意，特性被标记为部分表示没有完全被服务器支持，你需要安装额外的软件包。如果被标记为可选，则你必须安装第三方软件包才能使用。这三种服务器都已经在Linux、Solaris、微软Windows和Mac OS X上测试过，JBoss已经在HP-UX和AIX上的测试，而Tomcat也在AIX上也测试过。在下面的表格中，你可以找到更多关于它们各自特性的信息以及为什么这些特性如此重要。<br /><br /><strong>表1. Java EE的特性比较</strong></span></p>
<p><span style="font-size: small;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 4;"><strong><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Arial; mso-font-kerning: 0pt;">Table 1. Java EE feature comparison</span></strong></p>
<font size="3">
<p>
<table class="MsoNormalTable" border="1" cellpadding="0" style="mso-cellspacing: 1.5pt;">
<tbody>
<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes;">
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><strong><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Feature</span></strong></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><strong><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">JBoss 4.2</span></strong></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><strong><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Geronimo 2</span></strong></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><strong><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Tomcat 6</span></strong></p>
</td>
</tr>
<tr style="mso-yfti-irow: 1;">
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Java EE 5 compliance</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Partial</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">No</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 2;">
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">EJB 3.0 capable</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Available</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 3;">
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">JSP 2.1 and Servlet 2.5 capable</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 4;">
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">JavaServer Faces 1.2 support</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Available</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 5;">
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Custom plug-in support</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">No</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 6;">
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Business-rules engine support</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Available</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Available</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Available</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 7;">
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Hibernate 3.x support</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Available</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Available</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 8;">
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">JBoss Seam support</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Available</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 9;">
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Clustering support</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Partial</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 10; mso-yfti-lastrow: yes;">
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Eclipse IDE connector support</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
<td style="background-color: transparent; border: #ece9d8; padding: 0.75pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun;">Yes</span></p>
</td>
</tr>
</tbody>
</table>
<br /><img src="http://static.zooomr.com/images/4038372_183e7d0923_o.jpg" border="0" onclick="imgClick(this);" alt="image" style="display: inline;" /><br /><br />如果你的Java应用需求尤为广泛或者你希望保持全部的Java EE 5兼容性的话，那么Geronimo 2将是明智的选择。虽然JBoss 4.2没有完全兼容Sun的Java EE 5标准，但是JBoss 4.2小组负责了一些尖端技术，而这些技术将被所有的服务器使用并且将被添加到标准的Java EE 5中。Tomcat 6本身是一个轻量级的解决方案，它不包含所有的Java EE 5 特性以及在JBoss和Geronimo中提供的额外软件包，但它不需要太多的内存，甚至在小型服务器上也能运行得很快。<br /><br />现在，让我们看看为什么这些特性如此重要。<br /><br /><strong><span style="font-size: 12px;"><span style="color: green;">1.1. Java EE 5兼容性</span></span></strong><br /><br />如果你的企业级Java应用必须完全兼容Sun的Java EE 5服务器特性的话，那么Java EE兼容性就是一个重要的问题。Geronimo是三种服务器中唯一完全兼容Java EE 5的。JBoss 4.2支持大部分的Java EE 5特性，而且Red Hat马上就要公布的JBoss 5将对Java EE 5完全兼容。Tomcat是一个JSP/Servlet容器，它只支持基本的Java应用服务器特性。<br /><br /><strong><span style="font-size: 12px;"><span style="color: green;">1.2. EJB 3（企业JavaBeans技术）能力</span></span></strong><br /><br />企业JavaBeans（EJB）是一个为Java EE服务器应用开发服务的Java组件架构。它允许将功能封装到可重用组件中。早期版本的EJB被认为是难以开发的，即使其意图是给开发带来好处。而新的 EJB 3就是为了解决较早版本中存在的困难，并且提供了一些新的功能。JBoss 4.2和Geronimo都支持EJB 3。Tomcat本身不提供EJB 3的兼容性，但是你可以将Apache的</p>
</font></span></p>
<p>&nbsp;</p>
<p><a href="http://openejb.apache.org/" target="_new"><span style="font-size: small;">OpenEJB项目</span></a><span style="font-size: small;">可以嵌入到Tomcat中使其支持EJB 3。根据Apache基金会的Jeff Genender所述，Tomcat也可以在JBoss的嵌入式版本中运行。<br /><br /><strong><span style="font-size: 12px;"><span style="color: green;">1.3. JSP 2.1和Servlet 2.5能力</span></span></strong><br /><br />JSP/servlet特性是任何Java服务器中最基本的能力。JSP 2.1和servlet 2.5是新版Java EE 5中提供的能力。JBoss 4.2、Geronimo 2和Tomcat 6都支持这些新的JSP/servlet版本。<br /><br /><strong><span style="font-size: 12px;"><span style="color: green;">1.4. JSF 1.2支持</span></span></strong><br /><br />JSF （Java Server Faces）是一个Java EE的应用开发架构，它使得开发基于Web的用户界面更加容易。JSF不是一个需求驱动的MVC（模型视图-控制器）的体系结构，而是使用了基于组件的方法。JBoss 4.2和Geronimo 2都支持最新的JSF 1.2版本。JSF 1.2也可以在Tomcat 6上运行，但是发现了</span><a href="http://www.javaworld.com/javaworld/jw-12-2007/jw-12-appservers.html?page=3#resources" target="_new"><span style="font-size: small;">一些问题</span></a><span style="font-size: small;">。<br /><br /><strong><span style="font-size: 12px;"><span style="color: green;">1.5. 定制化插件支持</span></span></strong><br /><br />插件支持是一种可以将新功能或特性引入到服务器中的架构。JBoss称它的插件开发特性为MBeans（被管理的Beans）。Geronimo也有被称为 GBeans的相似功能。这些定制的Beans提供了一套开发和管理定制资源的接口，而这些接口也可以作为插件组件被重用。<br /><br />根据Jeff Genender所言，Geronimo使插件机制更进了一步：<br /><br />使用Geronimo，你可以从许多组件中挑选一部分来建立符合需要的应用服务器栈。例如，如果想安装Liferay门户、或者Apache目录服务，你可以在管理控制台中添加URL并通过网络安装插件。插件管理系统可以检索出所有必须的依赖并且安装它们。<br /><br />Geronimo也可以定制组件，Jeff总结如下：<br /><br />它具有使应用程序如你所愿的变成轻量级或者重量级的能力。你可以充分利用包括所有组件的Java EE 5栈，或者通过将Geronimo作为Web容器来使用少量的G，或者使用微型的G&mdash;&mdash;它仅仅是Geronimo内核和一个完美的SOA和ESB解决方案的基础。你可以添加和删除组件，来只提供自己想用的那部分。如果不需要EJB的话，你可以简单从控制台中删除组件。Red Hat的Chantal Yang表示：JBoss 4提供了&ldquo;从微内核&rdquo;组建应用服务器的好处。就像Yang所说，这使得JBoss能够以插件方式提供多种的组件来建立一个定制的应用服务器。<br /><br />Yang还表示，JBoss 5和它的微容器将极大地提高MBeas的插件支持能力，还没有别的应用服务器在其核心具有这样一个改进的基于POJO的微容器。<br /><br /><strong><span style="font-size: 12px;"><span style="color: green;">1.6. 业务规则引擎支持</span></span></strong><br /><br />几乎每一种应用都是建立在一系列业务规则上的，这也称为业务逻辑。业务规则引擎可以使业务逻辑规划更容易管理。在大多数的规划中，基本逻辑就是必须的工作。业务规则引擎可以使你容易实现更加智能的逻辑。JBoss 4.2，Geronimo 2和Tomcat 6都支持</span><a href="http://labs.jboss.com/drools/" target="_new"><span style="font-size: small;">Drools</span></a><span style="font-size: small;">，它是一个流行的、标准兼容并且强大的业务规则引擎。虽然Geronimo是一个完全Java EE 5认证的服务器，并可以运行Drools，但是JBoss在编写本文时已经提供了三年的Drools支持，这使得JBoss的Drools是一个更加强大的业务规则解决方案。JBoss公司最近已将Drools命名为</span><a href="http://www.jboss.com/products/rules" target="_new"><span style="font-size: small;">JBoss Rules</span></a><span style="font-size: small;">。此Drools项目本身开始于2001年。<br /><br /><strong><span style="font-size: 12px;"><span style="color: green;">1.7. Hibernate 3.x支持</span></span></strong><br /><br /></span><a href="http://www.hibernate.org/" target="_new"><span style="font-size: small;">Hibernate</span></a><span style="font-size: small;">为Java 语言提供对象关系映射（ORM）服务。其易于使用的框架允许你将面向对象的模型映射到传统的关系数据库中，这对于Java开发是一个有力的促进。简而言之，Hibernate管理持久化，让你能够将POJO存储到几乎任何类型的SQL数据库中。并且在进行操作时，对你的程序来说那些对SQL数据的访问是透明的，这使得应用数据和对象管理更加容易。<br /><br />Hibernate是一个开放源码包，最初是由JBoss的Gavin King领导的小组所开发。现在运行在许多Java EE服务器上，并且也能与J2SE一起工作。JBoss 4.2，Geronimo 2和Tomcat 6都支持Hibernate 3。<br /><br /><strong><span style="font-size: 12px;"><span style="color: green;">1.8. JBoss Seam支持</span></span></strong><br /><br />JBoss Seam是一个强大的应用框架，它整合了许多Java和Web技术，包括Ajax（asynchronous JavaScript and XML）、JSF、EJB 3、Java Protlets和BMP（business-process management）。<br /><br />Seam是JBoss的一个项目，所以JBoss自然支持它，同样Geronimo也支持。根据Seam的厂商所言，Seam应用可以运行在使用了JBoss可嵌入EJB 3容器的Tomcat上。<br /><br /><strong><span style="font-size: 12px;"><span style="color: green;">1.9. 集群支持</span></span></strong><br /><br /></span><a href="http://www.javaworld.com/javaworld/jw-12-2007/jw-12-appservers.html?page=3#resources" target="_new"><span style="font-size: small;">集群</span></a><span style="font-size: small;">是一个技术术语，它是多个并行运行的服务器，这些服务器提供相同服务、以求获得高可用性：因为通过服务器集群可以支持更多的客户，如果集群中的某个服务器崩溃，其它的服务器可以继续为客户提供服务。在Java EE服务器案例中，即使在集群中的一台服务器崩溃，Java应用仍然可以使用。集群为企业级Java应用提供了可扩展性、提高了性能，并消除了单点故障。<br /><br />JBoss 4.2，Geronimo 2和Tomcat 6都以某种方式支持集群。据Chantal Yang称，JBoss使用&ldquo;通过伙伴复制和细粒复制以高性能和高可靠的集群层&rdquo;。Geronimo最近发布了一个针对纠正Geronimo 2集群问题的补丁，所以在这点看来，Geronimo可能还要做一些测试。如果你对Geronimo的集群感兴趣，可以咨询Apache软件基金会。<br /><br /><strong><span style="font-size: 12px;"><span style="color: green;">1.10. Eclipse IDE支持</span></span></strong><br /><br />Eclipse 可以说是Java开发中最受欢迎的IDE，所以将它同你的Java EE服务器集成是培养良好开发的途径。JBoss、Geronimo和Tomcat都支持Eclipse集成。JBoss公司有自己版本的 Eclipse，被称作是Red Hat Developer Studio，在编写本文时还处于测试阶段。<br /><br /><strong><span style="font-size: 14px;"><span style="color: blue;">2. 安装与部署</span></span></strong><br /><br />根据测试，安装以上三种Java服务器都是非常容易的。除了将已下载的zip或者tar包解压，你所要做的就是设置JAVA_HOME环境变量指向Java 1.5的安装目录。在运行startup或者是shutdown脚本以启动或停止这些服务器之前，必须设置这个环境变量。注意在Linux/Unix系统中，可能还需要使用chmod命令赋予这些脚本可执行权限。<br /><br /><strong><span style="font-size: 12px;"><span style="color: green;">2.1. 部署</span></span></strong><br /><br />当谈到通用配置和部署时，Geronimo 2是非常光彩夺目的。我发现通过它的Web控制台（见下面的图1）来配置和部署Java应用是一件轻而易举的事。正如Jeff Genender的解释：<br /><br />Geronimo 控制台包含许多不同的向导以帮助使得应用服务器的配置尽可能简单。Geronimo包含的向导让你可以测试数据库连接池，安全领域等。你可以通过一个易于使用的向导来取代过去编辑XML配置或停止和重新启动服务器的工作，数据库连接池向导甚至可以为你从网络上下载大部分的驱动，以使你无需去找适合数据库的驱动。<br /><br />Geronimo控制台也可以配置大多数内嵌在Tomcat 6容器中的特性，甚至不必接触到一个XML配置文件。<br /><br />图 1. Geronimo Web 控制台（点击可放大图像）<br /></span><a href="http://www.javaworld.com/javaworld/jw-12-2007/images/Geronimo2.jpg" target="_new"><span style="font-size: small;"><img src="http://www.javaworld.com/javaworld/jw-12-2007/images/Geronimo2_thumb.jpg" border="0" onclick="imgClick(this);" alt="image" style="display: inline;" /></span></a><br /><br /><span style="font-size: small;">JBoss 4.2也有一个外观漂亮的管理控制台（见图2），但它并不提供和类似于Geronimo的特性。它主要是提供JBoss状况和监控信息，但缺乏部署功能。要部署一个应用程序，你可以简单的拷贝它到default/deploy目录中，然后它会被自动迅速的部署。当然，你可以在jboss- service.xml配置文件中指定自定义部署目录。<br /><br />图 2. JBoss Web控制台（点击可放大图像）<br /></span><a href="http://www.javaworld.com/javaworld/jw-12-2007/images/JBoss4.jpg" target="_new"><span style="font-size: small;"><img src="http://www.javaworld.com/javaworld/jw-12-2007/images/JBoss4_thumb.jpg" border="0" onclick="imgClick(this);" alt="image" style="display: inline;" /></span></a><br /><br /><span style="font-size: small;">Tomcat 6快速轻巧，正真形成一个轻量级的应用服务器。通过提供一个漂亮的Web控制台，它提供你所需要的基础功能（见图3）。你可以从基于Web的Tomcat 管理器中启动/停止和部署/卸载WAR应用。同时它还提供大部分有用的状态和监控信息。它也为Web控制台提供了一种良好的基础认证制度：你只需在 Tomcat服务器目录中的一个XML文件中简单的指定用户/密码。<br /><br />图 3. Tomcat Web控制台（点击可放大图像）<br /></span><a href="http://www.javaworld.com/javaworld/jw-12-2007/images/Tomcat6.jpg" target="_new"><span style="font-size: small;"><img src="http://www.javaworld.com/javaworld/jw-12-2007/images/Tomcat6_thumb.jpg" border="0" onclick="imgClick(this);" alt="image" style="display: inline;" /></span></a><br /><br /><span style="font-size: small;"><strong><span style="font-size: 14px;"><span style="color: blue;">3. 性能基准</span></span></strong><br /><br />随着可靠性的提高，性能或许是应用服务器中最重要的一个特性。为了服务器的基本测试，我使用JSP页面和编译好的Servlet做了简单的测试，看看应用服务器能处理多少用户应用会话、连接用户的速度有多快。真实世界中的Java应用非常广泛，而我对JSP和Servlet的测试却非常少量，因为我只要求测试这些服务器的基本可扩展性、可靠性和速度。<br /><br />通过使用双核64位CPU和4GB内存的服务器，我获得了三种服务器在运行于多达120万并发请求下的数据。这并不意味着同步连接，而是意味保持独一无二的、并发的、通过浏览器客户端连接的用户会话。如果我有更多的内存，我肯定可以获得超过120万的会话。<br /><br />图4和图5显示了基准测试结果。<br /><br />图 4. 启动大量的JSP会话<br /></span><a href="http://www.javaworld.com/javaworld/jw-12-2007/images/Benchmarks1.jpg" target="_new"><span style="font-size: small;"><img src="http://www.javaworld.com/javaworld/jw-12-2007/images/Benchmarks1_thumb.jpg" border="0" onclick="imgClick(this);" alt="image" style="display: inline;" /></span></a><br /><br /><span style="font-size: small;">图 5. 一个检查会话的Servlet的大量命中<br /></span><a href="http://www.javaworld.com/javaworld/jw-12-2007/images/Benchmarks2.jpg" target="_new"><span style="font-size: small;"><img src="http://www.javaworld.com/javaworld/jw-12-2007/images/Benchmarks2_thumb.jpg" border="0" onclick="imgClick(this);" alt="image" style="display: inline;" /></span></a><br /><br /><span style="font-size: small;">这里，用于搜集这些基准数据的代码只有几百行。为了获得准确数据，我为每种服务器都使用了同样的配置。在真实世界的Java EE应用中，每一个会话都保持比这个测试更多的数据，因此你可能得不到我所得到的如此海量的数字，除非你在一台有八个处理器和足够多的内存的服务器上运行。<br /><br />JBoss 4.2和Geronimo表现得非常不同，主要是因为Geronimo版本更加新、并且使用了最新的内核。Tomcat 6是最好的，这是因为它是一个专门为JSP/Servlet服务的轻量级的服务器，而这些正是我测试的基准。Tomcat只需要3秒的启动时间，而 JBoss和Geronimo则需要大约20秒。<br /><br />如果这些服务器使用完所有的内存，它们都将濒临崩溃。在JBoss 4.2中我曾经有一次Java空指针异常就试图关闭它的经历，即使它还没有使用完所有的内存。当用完所有内存时，Geronimo和Tomcat都似乎非常糟糕，此时关闭它们是非常困难的。<br /><br /><strong><span style="font-size: 14px;"><span style="color: blue;">4. 结论</span></span></strong><br /><br />我在商业Java应用服务器（如Sun的Java应用服务器和BEA的WebLogic）和开源替代品中都已经安装和部署了Java应用。在这篇文章中，根据我的经验，与开源服务器相比，商业应用服务器有更多的Bug，并且它们更难安装。部署也是一个问题，至少在Sun的Java应用服务器的最新版是这样。<br /><br />底线：JBoss，Geronimo和Tomcat是可靠、快速的，而且一定能够处理好在大型的企业级应用中的交易。此外，许多高需求的Java服务器技术特性来源于开源世界中，而不是商业世界中。<br /><br />在这篇文章中，我在特性、部署和性能方面比较了三种流行的开源JEE应用服务器。这些特性的比较可以帮助你决定选择最适合应用环境需求的开源应用服务器，而性能基准测试能帮助你的考虑更加全面。<br /><br /><strong><span style="font-size: 14px;"><span style="color: blue;">5. 作者自传</span></span></strong><br /><br /></span><a href="mailto:jon@jdcampbell.com" target="_new"><br /><span style="font-size: small;">Jonathan Campbell</span></a><span style="font-size: small;">是一个项目主管，拥有至少15个IT认证。自20世纪80年代末以来，他一直在各种风格的UNIX系统上和自20世纪90年代以来在Windows系统上开发软件。在网络工程和UNIX，Linux和WIndows平台的集成方面也有专门的知识。目前，他正在为各种企业和美国政府工作。<br /><br /><strong><span style="font-size: 14px;"><span style="color: blue;">6. 关于译者</span></span></strong><br /><br /></span><a href="mailto:sharpglasses@gmail.com" target="_new"><span style="font-size: small;">李功健</span></a><span style="font-size: small;">，Matrix编辑。毕业于大连理工大学机械电子工程专业。熟悉Java和C++软件开发，熟悉Windows、Redhat Linux操作系统 和SQL Server、Oracle等数据库管理系统。也从事过一些实际项目的开发工作。目前正在攻读研究生。</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://guoyaxin895.javaeye.com/blog/194777#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/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>Tue, 20 May 2008 12:24:36 +0800</pubDate>
        <link>http://guoyaxin895.javaeye.com/blog/194777</link>
        <guid>http://guoyaxin895.javaeye.com/blog/194777</guid>
      </item>
          <item>
        <title>(转)Spring学习笔记：3.第三章 IoC中的国际化</title>
        <author>guoyaxin895</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://guoyaxin895.javaeye.com">guoyaxin895</a>&nbsp;
                    链接：<a href="http://guoyaxin895.javaeye.com/blog/194519" style="color:red;">http://guoyaxin895.javaeye.com/blog/194519</a>&nbsp;
          发表时间: 2008年05月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>源自：<a href="../../../author/glchengang/index.html" target="_blank">陈刚</a>&nbsp;(<a href="http://blog.csdn.net/glchengang/" title="点击进入作者个人网站" target="_blank">个人网站</a>)</p>
<p>注：遗憾的一点是，图片的链接已失效，但基本不影响阅读。<img src="../../../images/smiles/icon_smile.gif" alt="" /></p>
<h1 style="margin: 15.6pt 0cm;"><span style="font-family: 黑体;">第三章</span><span lang="EN-US">&nbsp; IoC</span><span style="font-family: 黑体;">中的国际化（</span><span lang="EN-US">CVS</span><span style="font-family: 黑体;">版本：</span><span lang="EN-US">V002</span><span style="font-family: 黑体;">）</span></h1>
<p class="MsoNormal"><span style="font-family: 宋体;">从这一章开始，我将把实例的项目打开一个</span><span lang="EN-US">CVS</span><span style="font-family: 宋体;">版本，不知谁能提供一个</span><span lang="EN-US">FTP</span><span style="font-family: 宋体;">空间？</span></p>
<h3 style="margin-left: 30pt; text-indent: -30pt;"><span lang="EN-US">3.1<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>前言</h3>
<p class="MsoNormal"><span style="font-family: 宋体;">标题准确来说应该是&ldquo;使用</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">功能来实现我们所开发项目系统的国际化&rdquo;，国际化不是针对</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">的，而是针对你开发的整个系统。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">如果你使用过</span><span lang="EN-US">Eclipse</span><span style="font-family: 宋体;">的国际化，或者用过</span><span lang="EN-US">Eclipse</span><span style="font-family: 宋体;">的&ldquo;外部化字符串&rdquo;向导（</span><span lang="EN-US">Eclipse</span><span style="font-family: 宋体;">主菜单：源代码－＞外部化字符串），那么对</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">提供的国际化功能应该是非常容易理解，两者基本一样，或者说各种</span><span lang="EN-US">Java</span><span style="font-family: 宋体;">程序的国际化方式都基本一样。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">先谈谈</span><span lang="EN-US">Eclipse</span><span style="font-family: 宋体;">国际化的两个组成部分：</span><span lang="EN-US">*.properties</span><span style="font-family: 宋体;">的资源文件、获取资源文件内容的</span><span lang="EN-US">Message</span><span style="font-family: 宋体;">类。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">而</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">则和</span><span lang="EN-US">Eclipse</span><span style="font-family: 宋体;">的处理类似：资源文件两者是一样的，不同语言的翻译放在不同的资源文件里，连起名规则都一样；</span><span lang="EN-US">Eclipse</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Message</span><span style="font-family: 宋体;">类要自己写（代码通用，复制以前项目的即可，或用</span><span lang="EN-US">Eclipse</span><span style="font-family: 宋体;">的向导生成一个也行），</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">则已经有写好的</span><span lang="EN-US">Message</span><span style="font-family: 宋体;">类，我们在</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">的</span><span lang="EN-US">xml</span><span style="font-family: 宋体;">文件里注册一下即可使用（也可以实现</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">的</span><span lang="EN-US">MessageSource</span><span style="font-family: 宋体;">接口，自己来写一个</span><span lang="EN-US">Message</span><span style="font-family: 宋体;">类，代码并不复杂，不过这没什么必要，用</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">提供的就行了）。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">无论是</span><span lang="EN-US">Eclipse</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Message</span><span style="font-family: 宋体;">类，还是</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">的自带的</span><span lang="EN-US">Message</span><span style="font-family: 宋体;">类，或是我们自己写一个</span><span lang="EN-US">Message</span><span style="font-family: 宋体;">类，都是使用</span><span lang="EN-US">JDK</span><span style="font-family: 宋体;">的</span><span lang="EN-US">java.util.ResourceBundle</span><span style="font-family: 宋体;">类来实现</span><span lang="EN-US">*.properties</span><span style="font-family: 宋体;">文件的读取。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">下面用实例来体会一下，先给出本章完成之后的项目结构的截图：</span></p>
<p class="MsoNormal"><span lang="EN-US"><img src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050218image001.jpg" border="0" height="356" alt="" width="477" /></span></p>
<h3><span lang="EN-US">3.2&nbsp; 简单实例</span></h3>
<p class="MsoNormal"><span style="font-family: 宋体;">假设我们有如下程序，程序的作用是打印出一个字符串</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a7"><span lang="EN-US">package cn.com.chengang.spring;</span></p>
<p class="a7"><span lang="EN-US">public class MessageTest {</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String str = "ChenGang";</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str);</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a7"><span lang="EN-US">}</span></p>
</div>
<p class="MsoNormal"><span style="font-family: 宋体;">现在，我们要让这个程序能够根据使用者的语言情况输出不同的字符，比如：对英文使用者输出&ldquo;</span><span lang="EN-US">ChenGang</span><span style="font-family: 宋体;">&rdquo;，对中文使用者输出&ldquo;陈刚&rdquo;，对台湾使用输出&ldquo;陳剛&rdquo;等等。这个需求的实现方法如下：</span></p>
<p class="4" style="text-indent: 21pt;"><span lang="EN-US">1</span><span style="font-family: 楷体_GB2312;">、创建一系列的资源文件</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在</span><span lang="EN-US">cn.com.chengang.spring</span><span style="font-family: 宋体;">包下创建以下文件：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">1</span><span style="font-family: 宋体;">）</span><span lang="EN-US">messages.properties</span><span style="font-family: 宋体;">（默认：英文），内容仅一句，如下</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a7"><span lang="EN-US">chengang=Giles</span></p>
</div>
<p class="MsoNormal"><span style="font-family: 宋体;">&ldquo;</span><span lang="EN-US">chengang</span><span style="font-family: 宋体;">&rdquo;是键值，</span><span lang="EN-US">Giles</span><span style="font-family: 宋体;">是要输出的英文字符串</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">2</span><span style="font-family: 宋体;">）</span><span lang="EN-US">messages_zh_CN.properties</span><span style="font-family: 宋体;">（简体中文）</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a7"><span lang="EN-US">chengang=\u9648\u521A</span></p>
</div>
<p class="MsoNormal"><span style="font-family: 宋体;">&ldquo;</span><span lang="EN-US">\u9648\u521A</span><span style="font-family: 宋体;">&rdquo;是</span><span lang="EN-US">UNICODE</span><span style="font-family: 宋体;">码，对应的中文是&ldquo;陈刚&rdquo;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">3</span><span style="font-family: 宋体;">）</span><span lang="EN-US">messages_ zh_TW.properties</span><span style="font-family: 宋体;">（繁体中文）</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a7"><span lang="EN-US">chengang=\u9673\u525B</span></p>
</div>
<p class="MsoNormal"><span style="font-family: 宋体;">&ldquo;</span><span lang="EN-US">\u9673\u525B</span><span style="font-family: 宋体;">&rdquo;对应的中文是&ldquo;陳剛&rdquo;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">附注：由于中文是要转换成</span><span lang="EN-US">UNICODE</span><span style="font-family: 宋体;">码，在编辑和阅读上有诸多不便，如果是用</span><span lang="EN-US">Eclipse</span><span style="font-family: 宋体;">做</span><span lang="EN-US">IDE</span><span style="font-family: 宋体;">，则有一个编辑资源文件的插件</span><span lang="EN-US">jinto</span><span style="font-family: 宋体;">，下载网址是</span><span lang="EN-US"><a href="http://www.guh-software.de/">http://www.guh-software.de/</a></span><span style="font-family: 宋体;">，用它打开的资源文件如下图所示，可以看到三个资源在一个界面反映了出来。</span></p>
<p class="MsoNormal"><span lang="EN-US"><img src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050218image002.jpg" border="0" height="125" alt="" width="466" /></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">如果你不用</span><span lang="EN-US">Eclipse</span><span style="font-family: 宋体;">，而是用</span><span lang="EN-US">Editplugs</span><span style="font-family: 宋体;">＋</span><span lang="EN-US">JDK</span><span style="font-family: 宋体;">的方式来编程（现在还有这样的原始人吗？），你也可以用</span><span lang="EN-US">JDK</span><span style="font-family: 宋体;">自带的</span><span lang="EN-US">native2ascii.exe</span><span style="font-family: 宋体;">程序来将中文字串转成</span><span lang="EN-US">UNICODE</span><span style="font-family: 宋体;">码。</span><span lang="EN-US">Ant</span><span style="font-family: 宋体;">中还提供了一个相应的任务：</span><span lang="EN-US">&lt;native2ascii encoding="GBK" src="${src}" dest="${build}"/&gt;</span><span style="font-family: 宋体;">，其中</span><span lang="EN-US">GBK</span><span style="font-family: 宋体;">是一个中国的字符集。</span></p>
<p class="4" style="text-indent: 21pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="4" style="text-indent: 21pt;"><span lang="EN-US">2</span><span style="font-family: 楷体_GB2312;">、修改</span><span lang="EN-US">bean.xml</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">将</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">自带的</span><span lang="EN-US">org.springframework.context.support.ResourceBundleMessageSource</span><span style="font-family: 宋体;">类注册到</span><span lang="EN-US">bean.xml</span><span style="font-family: 宋体;">中，这个类的作用是获取资源文件的内容，注册到</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">的</span><span lang="EN-US">bean.xml</span><span style="font-family: 宋体;">文件中是为了自动获得此类的对象（</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">做了一些简化编程的处理）。</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a7"><span lang="EN-US">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></p>
<p class="a7"><span lang="EN-US">&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</span></p>
<p class="a7"><span lang="EN-US">&lt;beans&gt;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="Chinese" class="cn.com.chengang.spring.Chinese"/&gt;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="American" class="cn.com.chengang.spring.American"/&gt;</span></p>
<p class="a7"><span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"&gt;</span></p>
<p class="a7"><span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="basenames"&gt;</span></p>
<p class="a7"><span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;</span></p>
<p class="a7"><span style="color: #ff0000;">&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; &lt;value&gt;cn.com.chengang.spring.messages&lt;/value&gt;</span></p>
<p class="a7"><span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;</span></p>
<p class="a7"><span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</span></p>
<p class="a7"><span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</span></p>
<p class="a7"><span lang="EN-US">&lt;/beans&gt;</span></p>
</div>
<p class="MsoNormal"><span style="font-family: 宋体;">代码说明：</span></p>
<p class="Char"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">id="messageSource" </span><span style="font-family: 宋体;">的设置是不变的、必须的。</span></p>
<p class="Char"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">ResourceBundleMessageSource</span><span style="font-family: 宋体;">是</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">的一个</span><span lang="EN-US">Message</span><span style="font-family: 宋体;">类。这里还有一个选择，用</span><span lang="EN-US">ReloadableResourceBundleMessageSource</span><span style="font-family: 宋体;">类，此类可以提供不用重启即可重新加载资源文件的特性（前者对资源文件只加载一次）。对于那种有热修改资源文件的需求，后者比较合适，只是后者在效率上有可能有损耗，因为至少要多一些检查资源文件是否改变的代码（这只是我的猜测，我没有仔佃去读这段的源码）。</span></p>
<p class="Char"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">&ldquo;</span><span lang="EN-US">basenames</span><span style="font-family: 宋体;">&rdquo;是不变的、必须的。它是</span><span lang="EN-US">ResourceBundleMessageSource</span><span style="font-family: 宋体;">的一个属性，在源代码中的定义是&ldquo;</span><span lang="EN-US">private String[] basenames;</span><span style="font-family: 宋体;">&rdquo;，可见它是一个字符串数组。</span></p>
<p class="Char"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">&ldquo;</span><span lang="EN-US">cn.com.chengang.spring.messages</span><span style="font-family: 宋体;">&rdquo;是把资源文件的位置传入到</span><span lang="EN-US">basenames</span><span style="font-family: 宋体;">属性中。注意：三个资源文件只需要将共同的主名（红色字体）传入：</span><span style="color: #ff0000;">messages</span><span lang="EN-US">.properties</span><span style="font-family: 宋体;">、</span><span style="color: #ff0000;">messages</span><span lang="EN-US">_zh_CN.properties</span><span style="font-family: 宋体;">、</span><span style="color: #ff0000;">messages</span><span lang="EN-US">_zh_TW.properties</span><span style="font-family: 宋体;">。</span></p>
<p class="4" style="text-indent: 21pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="4" style="text-indent: 21pt;"><span lang="EN-US">3</span><span style="font-family: 楷体_GB2312;">、使用。修改</span><span lang="EN-US">MessageTest</span><span style="font-family: 楷体_GB2312;">类，如下</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a7"><span lang="EN-US">package cn.com.chengang.spring;</span></p>
<p class="a7"><span lang="EN-US">import org.springframework.context.ApplicationContext;</span></p>
<p class="a7"><span lang="EN-US">import org.springframework.context.support.FileSystemXmlApplicationContext;</span></p>
<p class="a7"><span lang="EN-US">public class MessageTest {</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String str = ctx.getMessage("chengang", null, null);</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str);</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a7"><span lang="EN-US">}</span></p>
</div>
<p class="MsoNormal"><span style="font-family: 宋体;">代码说明：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">1</span><span style="font-family: 宋体;">）</span><span lang="EN-US">main</span><span style="font-family: 宋体;">方法里</span></p>
<p class="Char"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">第一句取得</span><span lang="EN-US">bean.xml</span><span style="font-family: 宋体;">文件的配置信息。</span></p>
<p class="Char"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">第二句从资源文件里得到键值</span><span lang="EN-US">chengang</span><span style="font-family: 宋体;">对应的字符串。</span></p>
<p class="Char"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">第三句将字符串打印出来，结果是打印的是&ldquo;陈刚&rdquo;，说明读取的是</span><span lang="EN-US">messages_zh_CN.properties</span><span style="font-family: 宋体;">资源文件。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">2</span><span style="font-family: 宋体;">）</span><span lang="EN-US">ctx.getMessage("chengang", null, null);</span><span style="font-family: 宋体;">有三个参数：</span></p>
<p class="Char"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">第一个是资源文件的键值；</span></p>
<p class="Char"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">第二个是资源文件字符串的参数，由于本字符串没有参数，所以用一个</span><span lang="EN-US">null</span><span style="font-family: 宋体;">（后面给出了一个用到字符串参数的实例）；</span></p>
<p class="Char"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">第三个是一个</span><span lang="EN-US">java.util. Locale</span><span style="font-family: 宋体;">类型的参数。参数为</span><span lang="EN-US">null</span><span style="font-family: 宋体;">，则表示根据使用者的语言环境来选择</span><span lang="EN-US">Locale</span><span style="font-family: 宋体;">，因为我用的是中文版的</span><span lang="EN-US">windows</span><span style="font-family: 宋体;">，所以在取字符串时它自动选择了</span><span lang="EN-US">messages_zh_CN.properties</span><span style="font-family: 宋体;">资源文件。</span><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">这其中还有一个控制点在</span><span lang="EN-US">JVM</span><span style="font-family: 宋体;">，</span><span lang="EN-US">JVM</span><span style="font-family: 宋体;">会根据当前操作系统的语言环境进行相应处理，我们可以通过在</span><span lang="EN-US">JVM</span><span style="font-family: 宋体;">启动参数中追加&ldquo;</span><span lang="EN-US">-Duser.language=zh_TW</span><span style="font-family: 宋体;">&rdquo;来设定当前</span><span lang="EN-US">JVM</span><span style="font-family: 宋体;">语言类型，通过</span><span lang="EN-US">JVM</span><span style="font-family: 宋体;">级的设定，也可以实现自动切换所使用的资源文件类型。</span><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">所以这里面的控制语言的方式有三种：从最低层的操作系统的</span><span lang="EN-US">Locale</span><span style="font-family: 宋体;">设定，到更上一层的</span><span lang="EN-US">JVM</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Locale</span><span style="font-family: 宋体;">设定，再到程序一级的</span><span lang="EN-US">Locale</span><span style="font-family: 宋体;">设定。</span></p>
<h3><span lang="EN-US">3.3&nbsp; 资源文件的其他使用方式：</span></h3>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a7"><span lang="EN-US">package cn.com.chengang.spring;</span></p>
<p class="a7"><span lang="EN-US">import java.util.Locale;</span></p>
<p class="a7"><span lang="EN-US">import org.springframework.context.ApplicationContext;</span></p>
<p class="a7"><span lang="EN-US">import org.springframework.context.support.FileSystemXmlApplicationContext;</span></p>
<p class="a7"><span lang="EN-US">import org.springframework.context.support.ResourceBundleMessageSource;</span></p>
<p class="a7"><span lang="EN-US">public class MessageTest {</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String str = ctx.getMessage("chengang", null, null);</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str); //</span><span style="font-family: 'Courier New';">输出&ldquo;陈刚&rdquo;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="font-family: 'Courier New';">使用了</span><span lang="EN-US">messages.properties</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = ctx.getMessage("chengang", null, new Locale(""));</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str);//</span><span style="font-family: 'Courier New';">输出&ldquo;</span><span lang="EN-US">Giles</span><span style="font-family: 'Courier New';">&rdquo;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="font-family: 'Courier New';">使用了</span><span lang="EN-US">messages_zh_CN.properties</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;str = ctx.getMessage("chengang", null, new Locale("zh", "CN"));</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str);//</span><span style="font-family: 'Courier New';">输出&ldquo;陈刚&rdquo;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="font-family: 'Courier New';">使用了</span><span lang="EN-US">messages_zh_TW.properties</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = ctx.getMessage("chengang", null, new Locale("zh", "TW"));</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str);//</span><span style="font-family: 'Courier New';">输出&ldquo;陳剛&rdquo;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="font-family: 'Courier New';">使用了</span><span lang="EN-US">messages_zh_TW.properties</span><span style="font-family: 'Courier New';">，从这里可见资源文件的起名可以很随意，</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="font-family: 'Courier New';">比如我们建立一个</span><span lang="EN-US">messages_123.properties</span><span style="font-family: 'Courier New';">，在传参数时候就可以这样：</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * new Locale("123")</span><span style="font-family: 'Courier New';">，一样也可以取出</span><span lang="EN-US">messages_123.properties</span><span style="font-family: 'Courier New';">中的值</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = ctx.getMessage("chengang", null, new Locale("zh_TW"));</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str);//</span><span style="font-family: 'Courier New';">输出&ldquo;陳剛&rdquo;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="font-family: 'Courier New';">当找不到相应的资源文件时，使用了</span><span lang="EN-US">messages_zh_CN.properties</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = ctx.getMessage("chengang", null, new Locale("abcd"));</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str);//</span><span style="font-family: 'Courier New';">输出&ldquo;陈刚&rdquo;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="font-family: 'Courier New';">不通过</span><span lang="EN-US">IoC</span><span style="font-family: 'Courier New';">注册，直接使用</span><span lang="EN-US">ResourceBundleMessageSource</span><span style="font-family: 'Courier New';">类的写法。</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResourceBundleMessageSource s = new ResourceBundleMessageSource();</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.setBasename("cn.com.chengang.spring.messages");</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = s.getMessage("chengang", null, null);</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str);//</span><span style="font-family: 'Courier New';">输出&ldquo;陈刚&rdquo;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a7"><span lang="EN-US">}</span></p>
</div>
<p class="MsoNormal"><span style="font-family: 宋体;">代码说明：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">前面说过控制语言的方式有三种：从最低层的操作系统的</span><span lang="EN-US">Locale</span><span style="font-family: 宋体;">设定，到更上一层的</span><span lang="EN-US">JVM</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Locale</span><span style="font-family: 宋体;">设定，再到程序一级的</span><span lang="EN-US">Locale</span><span style="font-family: 宋体;">设定。我认为最佳的方法是在程序一级进行控制：定义一个统一的</span><span lang="EN-US">Locale</span><span style="font-family: 宋体;">静态变量，然后整个系统中只使用这一个变量，以后就可以通过界面操作设置此</span><span lang="EN-US">Locale</span><span style="font-family: 宋体;">变量的值，让用户来选择他所需的软件语言。而且我们也可以将此静态变量设成</span><span lang="EN-US">null</span><span style="font-family: 宋体;">值，来自动选择资源文件。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">另外，</span><span lang="EN-US">Locale</span><span style="font-family: 宋体;">里也定义了一些常量，我们可以直接使用而不必去</span><span lang="EN-US">new</span><span style="font-family: 宋体;">一个</span><span lang="EN-US">Locale</span><span style="font-family: 宋体;">对象，如：&ldquo;</span><span lang="EN-US">Locale.ENGLISH</span><span style="font-family: 宋体;">&rdquo;。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<h3><span lang="EN-US">3.4&nbsp; 再一个实例</span></h3>
<p class="MsoNormal"><span style="font-family: 宋体;">这个实例演示了如何使用多个资源文件，以及如何使用字符串参数</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">1</span><span style="font-family: 宋体;">）在</span><span lang="EN-US">cn.com.chengang.spring</span><span style="font-family: 宋体;">包下再创建一个资源文件</span><span lang="EN-US">messagesOther_zh_CN.properties</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a7"><span lang="EN-US">chengang.info=\u9648\u521A\uFF0C\u7F51\u540D\uFF1A{0}\uFF0C\u82F1\u6587\u540D\uFF1A{1}\uFF0CBlog\uFF1A{2}</span></p>
</div>
<p class="MsoNormal"><span style="font-family: 宋体;">其中</span><span lang="EN-US">UNICODE</span><span style="font-family: 宋体;">字符串对应的中文是：&ldquo;陈刚，网名：</span><span lang="EN-US">{0}</span><span style="font-family: 宋体;">，英文名：</span><span lang="EN-US">{1}</span><span style="font-family: 宋体;">，</span><span lang="EN-US">Blog</span><span style="font-family: 宋体;">：</span><span lang="EN-US">{2}</span><span style="font-family: 宋体;">&rdquo;，这个字符串一共有三个参数。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">2</span><span style="font-family: 宋体;">）修改</span><span lang="EN-US"> bean.xml</span><span style="font-family: 宋体;">文件</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">因为</span><span lang="EN-US">basenames</span><span style="font-family: 宋体;">属性是一个数组，当然也就可以接收多个资源文件设定。具体修改如下面的红字部份</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a7"><span lang="EN-US">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></p>
<p class="a7"><span lang="EN-US">&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</span></p>
<p class="a7"><span lang="EN-US">&lt;beans&gt;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="Chinese" class="cn.com.chengang.spring.Chinese"/&gt;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="American" class="cn.com.chengang.spring.American"/&gt;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"&gt;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="basenames"&gt;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;</span></p>
<p class="a7"><span lang="EN-US">&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; &lt;value&gt;cn.com.chengang.spring.messages&lt;/value&gt;</span></p>
<p class="a7"><span lang="EN-US">&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; <span style="color: #ff0000;">&lt;value&gt;cn.com.chengang.spring.messagesOther&lt;/value&gt;</span></span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</span></p>
<p class="a7"><span lang="EN-US">&lt;/beans&gt;</span></p>
</div>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">3</span><span style="font-family: 宋体;">）修改</span><span lang="EN-US">MessageTest</span><span style="font-family: 宋体;">类，加入几行使用的代码</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String[] strArgs = new String[3];</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strArgs[0]="</span><span style="font-family: 'Courier New';">混北民工</span><span lang="EN-US">";</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strArgs[1]="Giles";</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strArgs[2]="http://blog.csdn.net/glchengang";</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = ctx.getMessage("chengang.info", strArgs, null);</span></p>
<p class="a7"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str);</span></p>
</div>
<p class="MsoNormal"><span style="font-family: 宋体;">打印出来的结果就是：&ldquo;陈刚，网名：混北民工，英文名：</span><span lang="EN-US">Giles</span><span style="font-family: 宋体;">，</span><span lang="EN-US">Blog</span><span style="font-family: 宋体;">：</span><span lang="EN-US">http://blog.csdn.net/glchengang</span><span style="font-family: 宋体;">&rdquo;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<h3><span lang="EN-US">3.5&nbsp; 国际化的实践建议</span></h3>
<p class="a1"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">建议一个包对应一个资源文件。不要整个系统都使用一个资源文件来翻译，这样单个文档的体积就太大了，不利于维护；当然，也不必一个类对应一个资源文件，这样资源文件又太多了。</span></p>
<p class="a1"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">建议资源文件和其翻译类</span><span lang="EN-US">/</span><span style="font-family: 宋体;">包在同一目录下。不过，如果是要将软件打成一外</span><span lang="EN-US">JAR</span><span style="font-family: 宋体;">包或</span><span lang="EN-US">WAR</span><span style="font-family: 宋体;">包，建议把资源文件分离出来，这样可以修改资源文件，而不必再次打包。</span></p>
<p class="a1"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">建议字符串项的键值上加上其所在的类名。比如：上面的</span><span lang="EN-US">chengang</span><span style="font-family: 宋体;">和</span><span lang="EN-US">chengang.info</span><span style="font-family: 宋体;">最好是取名成</span><span lang="EN-US">MessageTest.chengang</span><span style="font-family: 宋体;">和</span><span lang="EN-US">MessageTest.chengang.info</span><span style="font-family: 宋体;">。这样查找使用此键值的类会方便很多。</span></p>
<p class="a1" style="margin-left: 18pt; text-indent: 0cm;"><span lang="EN-US">&nbsp;</span></p>
<p class="a1" style="margin-left: 18pt; text-indent: 0cm;"><span lang="EN-US">&nbsp;</span></p>
<p class="a1" style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体;">参考文献</span></p>
<p class="Char"><span style="font-size: 7.5pt; font-family: Wingdings;">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">夏昕的＜＜</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">开发指南＞＞</span><span lang="EN-US">&nbsp; <a href="http://www.xiaxin.net/Spring_Dev_Guide.rar">http://www.xiaxin.net/Spring_Dev_Guide.rar</a>&nbsp; </span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://guoyaxin895.javaeye.com/blog/194519#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/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>Mon, 19 May 2008 17:31:15 +0800</pubDate>
        <link>http://guoyaxin895.javaeye.com/blog/194519</link>
        <guid>http://guoyaxin895.javaeye.com/blog/194519</guid>
      </item>
          <item>
        <title>（转）Spring学习笔记：2.第二章 Spring中IoC的入门实例</title>
        <author>guoyaxin895</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://guoyaxin895.javaeye.com">guoyaxin895</a>&nbsp;
                    链接：<a href="http://guoyaxin895.javaeye.com/blog/194513" style="color:red;">http://guoyaxin895.javaeye.com/blog/194513</a>&nbsp;
          发表时间: 2008年05月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>源自：<a href="../../../author/glchengang/index.html" target="_blank">陈刚</a>&nbsp;(<a href="http://blog.csdn.net/glchengang/" title="点击进入作者个人网站" target="_blank">个人网站</a>)</p>
<p>注：遗憾的一点是，图片的链接已失效，但基本不影响阅读。<img src="../../images/smiles/icon_smile.gif" alt="" /></p>
<h1 style="margin: 15.6pt 0cm;"><span style="font-family: 黑体;">第二章</span><span lang="EN-US">&nbsp; Spring</span><span style="font-family: 黑体;">中</span><span lang="EN-US">IoC</span><span style="font-family: 黑体;">的入门实例</span></h1>
<p class="MsoNormal"><span lang="EN-US">Spring</span><span style="font-family: 宋体;">的模块化是很强的，各个功能模块都是独立的，我们可以选择的使用。这一章先从</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">的</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">开始。所谓</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">就是一个用</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">来定义生成对象的模式，我们看看如果来使用的。</span></p>
<h3><span lang="EN-US">1、数据模型。</span></h3>
<p class="MsoNormal" style="text-indent: 20pt;"><span lang="EN-US">1</span><span style="font-family: 宋体;">、如下图所示有三个类，</span><span lang="EN-US">Human</span><span style="font-family: 宋体;">（人类）是接口，</span><span lang="EN-US">Chinese</span><span style="font-family: 宋体;">（中国人）是一个子类，</span><span lang="EN-US">American</span><span style="font-family: 宋体;">（美国人）是另外一个子类。</span></p>
<p class="a" style="text-indent: 20pt;"><span lang="EN-US"><img src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image021.jpg" border="0" height="195" alt="" width="288" /></span></p>
<p class="MsoNormal" style="text-indent: 20pt;"><span style="font-family: 宋体;">源代码如下：</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a6"><span lang="EN-US">package cn.com.chengang.spring;</span></p>
<p class="a6"><span lang="EN-US">public interface Human {</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void eat();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void walk();</span></p>
<p class="a6"><span lang="EN-US">}</span></p>
</div>
<p class="MsoNormal" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a6"><span lang="EN-US">package cn.com.chengang.spring;</span></p>
<p class="a6"><span lang="EN-US">public class Chinese implements Human {</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; /* </span><span style="font-family: 'Courier New';">（非</span><span lang="EN-US"> Javadoc</span><span style="font-family: 'Courier New';">）</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; * @see cn.com.chengang.spring.Human#eat()</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; public void eat() {</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("</span><span style="font-family: 'Courier New';">中国人对吃很有一套</span><span lang="EN-US">");</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a6"><span lang="EN-US">&nbsp;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; /* </span><span style="font-family: 'Courier New';">（非</span><span lang="EN-US"> Javadoc</span><span style="font-family: 'Courier New';">）</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; * @see cn.com.chengang.spring.Human#walk()</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; public void walk() {</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("</span><span style="font-family: 'Courier New';">中国人行如飞</span><span lang="EN-US">");</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a6"><span lang="EN-US">}</span></p>
</div>
<p class="MsoNormal" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a6"><span lang="EN-US">package cn.com.chengang.spring;</span></p>
<p class="a6"><span lang="EN-US">public class American implements Human {</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; /* </span><span style="font-family: 'Courier New';">（非</span><span lang="EN-US"> Javadoc</span><span style="font-family: 'Courier New';">）</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; * @see cn.com.chengang.spring.Human#eat()</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; public void eat() {</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("</span><span style="font-family: 'Courier New';">美国人主要以面包为主</span><span lang="EN-US">");</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a6"><span lang="EN-US">&nbsp;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; /* </span><span style="font-family: 'Courier New';">（非</span><span lang="EN-US"> Javadoc</span><span style="font-family: 'Courier New';">）</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; * @see cn.com.chengang.spring.Human#walk()</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; public void walk() {</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("</span><span style="font-family: 'Courier New';">美国人以车代步，有四肢退化的趋势</span><span lang="EN-US">");</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a6"><span lang="EN-US">}</span></p>
</div>
<p class="MsoNormal" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;</span></p>
<h3><span lang="EN-US">2、对以上对象采用工厂模式的用法如下</span></h3>
<p class="MsoNormal" style="text-indent: 0cm;"><span style="font-family: 宋体;">创建一个工厂类</span><span lang="EN-US">Factory</span><span style="font-family: 宋体;">，如下。这个工厂类里定义了两个字符串常量，所标识不同的人种。</span><span lang="EN-US">getHuman</span><span style="font-family: 宋体;">方法根据传入参数的字串，来判断要生成什么样的人种。</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a6"><span lang="EN-US">package cn.com.chengang.spring;</span></p>
<p class="a6"><span lang="EN-US">public class Factory {</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; public final static String CHINESE = "Chinese";</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp; &nbsp;public final static String AMERICAN = "American";</span></p>
<p class="a6"><span lang="EN-US">&nbsp;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; public Human getHuman(String ethnic) {</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ethnic.equals(CHINESE))</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new Chinese();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (ethnic.equals(AMERICAN))</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new American();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalArgumentException("</span><span style="font-family: 'Courier New';">参数</span><span lang="EN-US">(</span><span style="font-family: 'Courier New';">人种</span><span lang="EN-US">)</span><span style="font-family: 'Courier New';">错误</span><span lang="EN-US">");</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a6"><span lang="EN-US">}</span></p>
</div>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">下面是一个测试的程序，使用工厂方法来得到了不同的&ldquo;人种对象&rdquo;，并执行相应的方法。</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a6"><span lang="EN-US">package cn.com.chengang.spring;</span></p>
<p class="a6"><span lang="EN-US">public class ClientTest {</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Human human = null;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human = new Factory().getHuman(Factory.CHINESE);</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human.eat();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human.walk();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human = new Factory().getHuman(Factory.AMERICAN);</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human.eat();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human.walk();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a6"><span lang="EN-US">}</span></p>
</div>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">控制台的打印结果如下：</span></p>
<p class="a" style="text-indent: 20pt;"><span lang="EN-US"><img src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image022.jpg" border="0" height="120" alt="" width="273" /></span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<h3><span lang="EN-US">3、采用Spring的IoC的用法如下：</span></h3>
<p class="MsoNormal"><span lang="EN-US">1</span><span style="font-family: 宋体;">、在项目根目录下创建一个</span><span lang="EN-US">bean.xml</span><span style="font-family: 宋体;">文件</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a6"><span lang="EN-US">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></p>
<p class="a6"><span lang="EN-US">&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</span></p>
<p class="a6"><span lang="EN-US">&lt;beans&gt;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="Chinese" class="cn.com.chengang.spring.Chinese"/&gt;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="American" class="cn.com.chengang.spring.American"/&gt;</span></p>
<p class="a6"><span lang="EN-US">&lt;/beans&gt;</span></p>
</div>
<p class="MsoNormal"><span lang="EN-US">bean.xml</span><span style="font-family: 宋体;">的位置如下图，注意不要看花眼把它看成是</span><span lang="EN-US">lib</span><span style="font-family: 宋体;">目录下的了，它是在</span><span lang="EN-US">myspring</span><span style="font-family: 宋体;">目录下的。</span></p>
<p class="a" style="text-indent: 20pt;"><span lang="EN-US"><img src="http://blog.csdn.net/images/blog_csdn_net/glchengang/97615/r_20050217image023.jpg" border="0" height="167" alt="" width="238" /></span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">2</span><span style="font-family: 宋体;">、修改</span><span lang="EN-US">ClientTest</span><span style="font-family: 宋体;">程序如下：</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a6"><span lang="EN-US">package cn.com.chengang.spring;</span></p>
<p class="a6"><span lang="EN-US">import org.springframework.context.ApplicationContext;</span></p>
<p class="a6"><span lang="EN-US">import org.springframework.context.support.FileSystemXmlApplicationContext;</span></p>
<p class="a6"><span lang="EN-US">public class ClientTest {</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; public final static String CHINESE = "Chinese";</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; public final static String AMERICAN = "American";</span></p>
<p class="a6"><span lang="EN-US">&nbsp;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Human human = null;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human = new Factory().getHuman(Factory.CHINESE);</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human.eat();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human.walk();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human = new Factory().getHuman(Factory.AMERICAN);</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human.eat();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human.walk();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Human human = null;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human = (Human) ctx.getBean(CHINESE);</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human.eat();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human.walk();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human = (Human) ctx.getBean(AMERICAN);</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human.eat();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; human.walk();</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a6"><span lang="EN-US">}</span></p>
</div>
<p class="MsoNormal"><span style="font-family: 宋体;">从这个程序可以看到，</span><span lang="EN-US">ctx</span><span style="font-family: 宋体;">就相当于原来的</span><span lang="EN-US">Factory</span><span style="font-family: 宋体;">工厂，原来的</span><span lang="EN-US">Factory</span><span style="font-family: 宋体;">就可以删除掉了。然后又把</span><span lang="EN-US">Factory</span><span style="font-family: 宋体;">里的两个常量移到了</span><span lang="EN-US">ClientTest</span><span style="font-family: 宋体;">类里，整个程序结构基本一样。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">再回头看原来的</span><span lang="EN-US">bean.xml</span><span style="font-family: 宋体;">文件的这一句</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a6"><span lang="EN-US">&lt;bean id="Chinese" class="cn.com.chengang.spring.Chinese"/&gt;</span></p>
</div>
<p class="MsoNormal"><span lang="EN-US">id</span><span style="font-family: 宋体;">就是</span><span lang="EN-US">ctx.getBean</span><span style="font-family: 宋体;">的参数值，一个字符串。</span><span lang="EN-US">class</span><span style="font-family: 宋体;">就是一个类（包名＋类名）。然后在</span><span lang="EN-US">ClientTest</span><span style="font-family: 宋体;">类里获得</span><span lang="EN-US">Chinese</span><span style="font-family: 宋体;">对象就是这么一句</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a6"><span lang="EN-US">human = (Human) ctx.getBean(CHINESE);</span></p>
</div>
<p class="MsoNormal" style="text-indent: 0cm;"><span style="font-family: 宋体;">因为</span><span lang="EN-US">getBean</span><span style="font-family: 宋体;">方法返回的是</span><span lang="EN-US">Object</span><span style="font-family: 宋体;">类型，所以前面要加一个类型转换。</span></p>
<p class="MsoNormal" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;</span></p>
<h3><span lang="EN-US">4、总结</span></h3>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">1</span><span style="font-family: 宋体;">）也许有人说，</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">和工厂模式不是一样的作用吗，用</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">好象还麻烦一点。</span></p>
<p class="MsoNormal" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">举个例子，如果用户需求发生变化，要把</span><span lang="EN-US">Chinese</span><span style="font-family: 宋体;">类修改一下。那么前一种工厂模式，就要更改</span><span lang="EN-US">Factory</span><span style="font-family: 宋体;">类的方法，并且重新编译布署。而</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">只需要将</span><span lang="EN-US">class</span><span style="font-family: 宋体;">属性改变一下，并且由于</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">利用了</span><span lang="EN-US">Java</span><span style="font-family: 宋体;">反射机制，这些对象是动态生成的，这时我们就可以热插拨</span><span lang="EN-US">Chinese</span><span style="font-family: 宋体;">对象（不必把原程序停止下来重新编译布署）</span></p>
<p class="MsoNormal" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">（</span><span lang="EN-US">2</span><span style="font-family: 宋体;">）也许有人说，即然</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">这么好，那么我把系统所有对象都用</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">方式来生成。</span></p>
<p class="MsoNormal" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">注意，</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">的灵活性是有代价的：设置步骤麻烦、生成对象的方式不直观、反射比正常生成对象在效率上慢一点。因此使用</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">要看有没有必要，我认为比较通用的判断方式是：用到工厂模式的地方都可以考虑用</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">模式。</span></p>
<p class="MsoNormal" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">（</span><span lang="EN-US">3</span><span style="font-family: 宋体;">）在上面的</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">的方式里，还有一些可以变化的地方。比如，</span><span lang="EN-US">bean.xml</span><span style="font-family: 宋体;">不一定要放在项目录下，也可以放在其他地方，比如</span><span lang="EN-US">cn.com.chengang.spring</span><span style="font-family: 宋体;">包里。不过在使用时也要变化一下，如下所示：</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a6"><span lang="EN-US">new FileSystemXmlApplicationContext("src/cn/com/chengang/spring/bean.xml");</span></p>
</div>
<p class="MsoNormal"><span style="font-family: 宋体;">另外，</span><span lang="EN-US">bean.xml</span><span style="font-family: 宋体;">也可以改成其他名字。这样我们在系统中就可以分门别类的设置不同的</span><span lang="EN-US">bean.xml</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">4</span><span style="font-family: 宋体;">）关于</span><span lang="EN-US">IoC</span><span style="font-family: 宋体;">的低侵入性。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">什么是低侵入性？如果你用过</span><span lang="EN-US">Struts</span><span style="font-family: 宋体;">或</span><span lang="EN-US">EJB</span><span style="font-family: 宋体;">就会发现，要继承一些接口或类，才能利用它们的框架开发。这样，系统就被绑定在</span><span lang="EN-US">Struts</span><span style="font-family: 宋体;">、</span><span lang="EN-US">EJB</span><span style="font-family: 宋体;">上了，对系统的可移植性产生不利的影响。如果代码中很少涉及某一个框架的代码，那么这个框架就可以称做是一个低侵入性的框架。</span></p>
<p class="MsoNormal"><span lang="EN-US">Spring</span><span style="font-family: 宋体;">的侵入性很低，</span><span lang="EN-US">Humen.java</span><span style="font-family: 宋体;">、</span><span lang="EN-US">Chinese.java</span><span style="font-family: 宋体;">等几个类都不必继承什么接口或类。但在</span><span lang="EN-US">ClientTest</span><span style="font-family: 宋体;">里还是有一些</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">的影子：</span><span lang="EN-US">FileSystemXmlApplicationContext</span><span style="font-family: 宋体;">类和</span><span lang="EN-US">ctx.getBean</span><span style="font-family: 宋体;">方式等。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">现在，低侵入性似乎也成了判定一个框架的实现技术好坏的标准之一。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">5</span><span style="font-family: 宋体;">）关于</span><span lang="EN-US">bean.xml</span><span style="font-family: 宋体;">的用法</span></p>
<p class="MsoNormal"><span lang="EN-US">bean.xml</span><span style="font-family: 宋体;">的用法还有很多，其中内容是相当丰富的。假设</span><span lang="EN-US">Chinese</span><span style="font-family: 宋体;">类里有一个</span><span lang="EN-US">humenName</span><span style="font-family: 宋体;">属性（姓名），那么原的</span><span lang="EN-US">bean.xml</span><span style="font-family: 宋体;">修改如下。此后生成</span><span lang="EN-US">Chinese</span><span style="font-family: 宋体;">对象时，&ldquo;陈刚&rdquo;这个值将自动设置到</span><span lang="EN-US">Chinese</span><span style="font-family: 宋体;">类的</span><span lang="EN-US">humenName</span><span style="font-family: 宋体;">属性中。而且由于</span><span lang="EN-US">singleton</span><span style="font-family: 宋体;">为</span><span lang="EN-US">true</span><span style="font-family: 宋体;">这时生成</span><span lang="EN-US">Chinese</span><span style="font-family: 宋体;">对象将采用单例模式，系统仅存在一个</span><span lang="EN-US">Chinese</span><span style="font-family: 宋体;">对象实例。</span></p>
<div style="padding-right: 4pt; padding-left: 4pt; background: #fff0e1; padding-bottom: 1pt; padding-top: 1pt; border: windowtext 1pt solid;">
<p class="a6"><span lang="EN-US">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></p>
<p class="a6"><span lang="EN-US">&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</span></p>
<p class="a6"><span lang="EN-US">&lt;beans&gt;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="Chinese" class="cn.com.chengang.spring.Chinese" &nbsp;singleton="true"&gt;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="humenName"&gt;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;</span><span style="font-family: 宋体;">陈刚</span><span lang="EN-US">&lt;/value&gt;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</span></p>
<p class="a6"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="American" class="cn.com.chengang.spring.American"/&gt;</span></p>
<p class="a6"><span lang="EN-US">&lt;/beans&gt;</span></p>
</div>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">关于</span><span lang="EN-US">bean.xml</span><span style="font-family: 宋体;">的其它用法，不再详细介绍了，大家自己拿</span><span lang="EN-US">Spring</span><span style="font-family: 宋体;">的文档一看就明白了。</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://guoyaxin895.javaeye.com/blog/194513#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, 19 May 2008 17:12:08 +0800</pubDate>
        <link>http://guoyaxin895.javaeye.com/blog/194513</link>
        <guid>http://guoyaxin895.javaeye.com/blog/194513</guid>
      </item>
          <item>
        <title>（转）Spring学习笔记：1、概念理解</title>
        <author>guoyaxin895</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://guoyaxin895.javaeye.com">guoyaxin895</a>&nbsp;
                    链接：<a href="http://guoyaxin895.javaeye.com/blog/194506" style="color:red;">http://guoyaxin895.javaeye.com/blog/194506</a>&nbsp;
          发表时间: 2008年05月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>源自：<a href="../../../author/glchengang/index.html" target="_blank">陈刚</a>&nbsp;(<a href="http://blog.csdn.net/glchengang/" title="点击进入作者个人网站" target="_blank">个人网站</a>)&nbsp;</p>
<p>用Spring耳闻已久，但一直没有时间和心情去看它，最近它的声音是越来越大了，Java视线<a href="http://forum.javaeye.com/">http://forum.javaeye.com/</a>有不高手在谈论它。于是趁着有空闲时间，我也花了两个晚上看了看Spring，看的是夏昕的&lt;Spring开发指南&gt;http://www.xiaxin.net/Spring_Dev_Guide.rar，文章写得不错。以下谈谈我的学习感受</p>
<p>一、Spring的IoC(Inversion of Control)。<br />这是Spring中得有特点的一部份。IoC又被翻译成&ldquo;控制反转&rdquo;，也不知道是谁翻译得这么别扭，感觉很深奥的词。其实，原理很简单，用一句通俗的话来说：就是用XML来定义生成的对象。IoC其实是一种设计模式，Spring只是实现了这种设计模式。</p>
<p>这种设计模式是怎么来的呢？是实践中逐渐形成的。</p>
<p>第一阶段：用普通的无模式来写Java程序。一般初学者都要经过这个阶段。<br />第二阶段：频繁的开始使用接口，这时，接口一般都会伴随着使用工厂模式。<br />第三阶段：使用IoC模式。工厂模式还不够好：（1）因为的类的生成代码写死在程序里，如果你要换一个子类，就要修改工厂方法。（2）一个接口常常意味着一个生成工厂，会多出很多工厂类。<br />&nbsp;&nbsp;&nbsp; 可以把IoC模式看做是工厂模式的升华，可以把IoC看作是一个大工厂，只不过这个大工厂里要生成的对象都是在XML文件中给出定义的，然后利用Java的&ldquo;反射&rdquo;编程，根据XML中给出的类名生成相应的对象。从实现来看，IoC是把以前在工厂方法里写死的对象生成代码，改变为由XML文件来定义，也就是把工厂和对象生成这两者独立分隔开来，目的就是提高灵活性和可维护性。</p>
<p>&nbsp;&nbsp;&nbsp; IoC中最基本的Java技术就是&ldquo;反射&rdquo;编程。反射又是一个生涩的名词，通俗的说反射就是根据给出的类名（字符串）来生成对象。这种编程方式可以让对象在生成时才决定要生成哪一种对象。我在最近的一个项目也用到了反射，当时是给出一个.properties文本文件，里面写了一些全类名（包名＋类名），然后，要根据这些全类名在程序中生成它们的对象。反射的应用是很广泛的，象Hibernate、String中都是用&ldquo;反射&rdquo;做为最基本的技术手段。</p>
<p>&nbsp;&nbsp;&nbsp; 在过去，反射编程方式相对于正常的对象生成方式要慢10几倍，这也许也是当时为什么反射技术没有普通应用开来的原因。但经SUN改良优化后，反射方式生成对象和通常对象生成方式，速度已经相差不大了（但依然有一倍以上的差距）。</p>
<p><br />&nbsp;&nbsp;&nbsp; 所以要理解IoC，你必须先了解工厂模式和反射编程，否则对它产生的前因后果和实现原理都是无法理解透彻的。只要你理解了这一点，你自己也完全可以自己在程序中实现一个IoC框架，只不是这还要涉及到XML解析等其他知识，稍微麻烦一些。</p>
<p><br />&nbsp;&nbsp;&nbsp; IoC最大的好处是什么？因为把对象生成放在了XML里定义，所以当我们需要换一个实现子类将会变成很简单（一般这样的对象都是现实于某种接口的），只要修改XML就可以了，这样我们甚至可以实现对象的热插拨（有点象USB接口和SCIS硬盘了）。</p>
<p>&nbsp;&nbsp;&nbsp; IoC最大的缺点是什么？（1）生成一个对象的步骤变复杂了（其实上操作上还是挺简单的），对于不习惯这种方式的人，会觉得有些别扭和不直观。（2）对象生成因为是使用反射编程，在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说，这点损耗是微不足道的，除非某对象的生成对效率要求特别高。（3）缺少IDE重构操作的支持，如果在Eclipse要对类改名，那么你还需要去XML文件里手工去改了，这似乎是所有XML方式的缺憾所在。</p>
<p>&nbsp;&nbsp;&nbsp; 总的来说IoC无论原理和实现都还算是很简单的。一些人曾认为IoC没什么实际作用，这种说法是可以理解的，因为如果你在编程中很少使用接口，或很少使用工厂模式，那么你根本就没有使用IoC的强烈需要，也不会体会到IoC可贵之处。有些人也说要消除工厂模式、单例模式，但是都语焉不详、人云亦云。但如果你看到IoC模式和用上Spring，那么工厂模式和单例模式的确基本上可以不用了。但它消失了吗？没有！Spring的IoC实现本身就是一个大工厂，其中也包含了单例对象生成方式，只要用一个设置就可以让对象生成由普通方式变单一实例方式，非常之简单。</p>
<p>&nbsp;&nbsp; 总结：<br />&nbsp;&nbsp; （1）IoC原理很简单，作用的针对性也很强，不要把它看得很玄乎。<br />&nbsp;&nbsp; （2）要理解IoC，首先要了解&ldquo;工厂、接口、反射&rdquo;这些概念。</p>
<p><br />二、Spring的MVC</p>
<p>如果你已经熟悉Struts，那么不必把MVC做为重点学习内容。基本上我认为Spring&nbsp; MVC是一个鸡肋，它的技术上很先进，但易用性上没有Struts好。而且Struts有这么多年的基础了，Spring很难取代Struts的地位。这就是先入为主的优秀，一个项目经理选用一种框架，不能单纯的从它的技术上考虑，还有开发效率，人员配置等都是考虑因素。但做为研究性的学习，Spring的MVC部份还是蛮有价值的。</p>
<p><br />三、数据库层的模板<br />Spring主要是提供了一些数据库模板（模板也是一种Java设计模式），让数据部分的代码更简洁，那些try...catch都可以不见了。这个的确是个好东东。</p>
<p><br />四、AOP</p>
<p>AOP又称面向方面编程，它的实现原理还是用了反射：通过对某一个种类的方法名做监控来实现统一处理。比如：监控以&ldquo;insert&rdquo;字符串开头的方法名，在这种方法执行的前后进行某种处理（数据库事务等）。但这里我有一个疑问？不一定所有以insert开头的方法都是数据库操作，哪么当某个insert开头的方法不是数据库操作，你又对它进行了数据事务的操作，这样的错误如何防止？？？我对这方面了解不深，还是只知道一个大概。</p>
<p><br />曾看过一个程序员发出这样的感慨：框架一个接一个，学也学不完，而且有必要吗？这样一层层的加上框架，还不如直接写JSP来得直接，效率还高。我想这种困惑很多人都有吧？但如果你经过的项目渐多，就会发现，维护项目要比开发项目更艰难，代价更大。那种用JSP直接来写，层次又不清楚的开发，往往最后得到一个不可再修改的软件，一团乱麻，移一发而动全身。但软件不象电视机，做好了就不会改动了，软件是一个变化的事物，用户的需求随时会改变，这时你会体会到分层和使用框架的好处了，它们为你做了软件中很多和业务无关的工作，你可以只关注业务，并减少代码量。唯一缺点就是有一个学习的代价，框架配置上也较麻烦。</p>
<p><br />学习框架，我认为应该：第一步，了解这个框架中的一些关键概念，它的具体含义是什么。第二步，了解这个框架的精华在哪里，它能对开发起到什么样的作用，最好能对它的原理有一定的了解。第三步，用这个框架来写几个例子，实际体会一下。我现在还是刚刚大概完成了前两步，这几天会再看看Spring的文档并用Spring写几个例子，到时一起发出来。</p>
<p>另外，很赞赏&lt;Spring开发指南&gt;的作者夏昕的观点，将自已的经验写成文档公开出来，不过一个人的力量终究太弱。最好能够形成一个组织，对一种新技术，由一两个人出一个大纲，大家把它分了，更写一章，然后由两三个人总集起。我个人感觉，由于英文语言的关系，新技术引进到国内的还是太慢了，至少要比国外慢上一年以上，成立一个开源文档组织还是很有意义的事。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://guoyaxin895.javaeye.com/blog/194506#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, 19 May 2008 16:53:40 +0800</pubDate>
        <link>http://guoyaxin895.javaeye.com/blog/194506</link>
        <guid>http://guoyaxin895.javaeye.com/blog/194506</guid>
      </item>
          <item>
        <title>什么是Spring（转）</title>
        <author>guoyaxin895</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://guoyaxin895.javaeye.com">guoyaxin895</a>&nbsp;
                    链接：<a href="http://guoyaxin895.javaeye.com/blog/194428" style="color:red;">http://guoyaxin895.javaeye.com/blog/194428</a>&nbsp;
          发表时间: 2008年05月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>注：此文章转载自其他网站，其中的&ldquo;配置文件&rdquo;的代码部分残缺，非常抱歉。待今后修正。如果某君发现此文章的完整副本，烦请通知一声。谢谢。</p>
<p>一、&nbsp;&nbsp;&nbsp;&nbsp;Spring诞生<br />Spring是一个开源框架，目前在开源社区的人气很旺，被认为是最有前途的开源框架之一。她是由Rod&nbsp;Johnson创建的，她的诞生是为了简化企业级系统的开发。说道Spring就不得不说EJB，因为Spring在某种意义上是EJB的替代品，她是一种轻量级的容器。用过EJB的人都知道EJB很复杂，为了一个简单的功能你不得不编写多个Java文件和部署文件，他是一种重量级的容器。也许你不了解EJB，你可能对&ldquo;轻（重）量级&rdquo;和&ldquo;容器&rdquo;比较陌生，那么这里我简单介绍一下。<br />1、什么是容器<br />&ldquo;容器&rdquo;，这个概念困扰我好久。从学习Tomcat开始就一直对此感到困惑。感性的来讲，容器就是可以用来装东西的物品。那么在编程领域就是指用来装对象（OO的思想，如果你连OO都不了解，建议你去学习OO先）的对象。然而这个对象比较特别，它不仅要容纳其他对象，还要维护各个对象之间的关系。这么讲可能还是太抽象，来看一个简单的例子：<br />代码片断1：</p>
<div class="codeStyle"><ol>
<li><strong><span style="color: #0000ff;">public</span></strong>&nbsp;<strong><span style="color: #0000ff;">class</span></strong>&nbsp;<span style="color: #ff0000;">Container</span>&nbsp; </li>
<li>{ </li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">public</span></strong>&nbsp;<strong><span style="color: #0000ff;">void</span></strong>&nbsp;init() </li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;{ </li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;Speaker&nbsp;s&nbsp;=&nbsp;<strong><span style="color: #0000ff;">new</span></strong>&nbsp;Speaker(); </li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;Greeting&nbsp;g&nbsp;=&nbsp;<strong><span style="color: #0000ff;">new</span></strong>&nbsp;Greeting(s); </li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
<li>} </li>
</ol></div>
<p><br />可以看到这里的Container类（容器）在初始化的时候会生成一个Speaker对象和一个Greeting对象，并且维持了它们的关系，当系统要用这些对象的时候，直接问容器要就可以了。这就是容器最基本的功能，维护系统中的实例（对象）。如果到这里你还是感到模糊的话，别担心，我后面还会有相关的解释。<br /><br />2、轻量级与重量级<br />所谓&ldquo;重量级&rdquo;是相对于&ldquo;轻量级&rdquo;来讲的，也可以说&ldquo;轻量级&rdquo;是相对于重量级来讲的。在Spring出现之前，企业级开发一般都采用EJB，因为它提供的事务管理，声明式事务支持，持久化，分布计算等等都&ldquo;简化&rdquo;了企业级应用的开发。我这里的&ldquo;简化&rdquo;打了双引号，