<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>superleo</title>
    <description>热爱生活，热爱技术，希望能永远做最喜爱的编程。</description>
    <link>http://superleo.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>【翻译】EJB3.1真的来了吗？EJB3.1系列文章(三)</title>
        <author>kyo100900</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://superleo.javaeye.com">kyo100900</a>&nbsp;
                    链接：<a href="http://superleo.javaeye.com/blog/188621" style="color:red;">http://superleo.javaeye.com/blog/188621</a>&nbsp;
          发表时间: 2008年05月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>文本继续和大家分享EJB3.1特性，今天谈到的EJB Lite我个人感觉更像是Spring的子集．至于首先谈到的异步Session Bean调用，到底是消息驱动Bean的替代品还是补充，更需要更进一步的信息，废话不多说了，开始吧．</p>
<p>&nbsp;原文请看：http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesEJB31-3</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">讨论</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">该系列文章预先给大家介绍了专家组们正在继续研究</span><span lang="EN-US"><span style="font-family: Times New Roman;">JavaEE</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">下一版本的规范&mdash;&mdash;</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB3.1</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">所带来的改变。理想情况下，文章提到的这些变化，希望可以尽早的从你那里得到反馈从而使得专家组可以做出最好的选择。</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB3.0</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">已经将笨重的</span><span lang="EN-US"><span style="font-family: Times New Roman;">JavaEE</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">编程模型转变得简洁明了。</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB3.1</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的目标就是在此基础上通过添加一系列必须的特性，使得</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">走的更远。在应系列的每一篇文章中，我将告诉你专家组的进展情况。</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">本系列的前两篇文章已经谈到一些特性包括：可选的</span><span lang="EN-US"><span style="font-family: Times New Roman;">Session Beans</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">接口，增强的</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB Timer Service</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">以及简化后的打包机制。本文作为</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB3.1</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的第三部分，将涉及两个新特性：</span><span lang="EN-US"><span style="font-family: Times New Roman;">asynchronous Session Bean invocation(</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">异步</span><span lang="EN-US"><span style="font-family: Times New Roman;">Session Bean</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">) </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span><span lang="EN-US"><span style="font-family: Times New Roman;"> EJB Lite</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。不过请记住，这一切还没有最终敲定，</span><span lang="EN-US"><span style="font-family: Times New Roman;">JCP</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">成员还只是刚刚提出这些特性，所以如果必要的话，你可以反馈给我们。</span></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">最初草案已经公开了</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">EJB3.1</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">规范的草案已经两个星期前就发布了，你可以通过</span><span lang="EN-US"><a href="http://jcp.org/aboutJava/communityprocess/edr/jsr318/index.html" target="_blank"><span style="font-family: Times New Roman;">http://jcp.org/aboutJava/communityprocess/edr/jsr318/index.html</span></a></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">来获得相关信息。也许你已经知道，草案囊括的是整个规模，并仅仅是新加入的这些特性，但不要泄气，跳过原有的</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB3.0</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">部分并不十分困难。注意，草案并不等同于最后的规范，还需继续完善，并提交给供应商们，让他们实现自己的产品，所以从开发人员的角度来看，可读性稍稍有点困难。希望你能一如既往的将你的想法和建议反馈给</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB3.1</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">专家组，邮箱是</span><span lang="EN-US"><a href="mailto:jsr-318-comments@jcp.org"><span style="font-family: Times New Roman;">jsr-318-comments@jcp.org</span></a></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。当然，可以直接发给我个人邮箱：</span><span lang="EN-US"><a href="mailto:reza@rahmannet.net"><span style="font-family: Times New Roman;">reza@rahmannet.net</span></a></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">异步</span><span style="font-size: 12pt; color: #ff6600;"><span style="font-family: Times New Roman;">Session Beans</span></span><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">调用</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">令人惊讶的是，对于许多企业应用程序来说，异步处理实际上是一个普通的需求。大多数案例比如说使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">fire-and-forget </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">模式［注</span><span lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">］来后台处理一些长任务（或长事务）时，一方面尽量使得用户接口易于接受和使用，另一方面还可以通过简单通过利用并行计算来增强应用程序。最早的</span><span lang="EN-US"><span style="font-family: Times New Roman;">JavaEE</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">实现就是今天我们所使用的消息驱动</span><span lang="EN-US"><span style="font-family: Times New Roman;">Beans(Message Driven Beans)</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。实际上，在《</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB3 in Action</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">》一书中第一个消息驱动</span><span lang="EN-US"><span style="font-family: Times New Roman;">Beans</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">实例，用于实现一个异步订单功能。更进一步的说，</span><span style="font-family: Times New Roman;"> </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在客户确认订单后，消息驱动</span><span lang="EN-US"><span style="font-family: Times New Roman;">Beans OrderBillingMDS</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">异步的给客户开出账单．并且当支持结果完成后（无论是支持成功还是失败），更新订单信息．请看下面的图</span><span lang="EN-US"><span style="font-family: Times New Roman;">1:</span></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p style="TEXT-ALIGN: center"><img src="http://www.theserverside.com/tt/articles/content/NewFeaturesEJB31-3/clip_image002.jpg" alt="" width="359" height="129" /></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">图</span><span lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：异步订单支付</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left">&nbsp;</p>
<p><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">虽然消息驱动</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">Beans</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的确可以进行异步处理，同样又要求你处理</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">JMS</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">以及一些其它相关功能。</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">而现在，这一切刚好可以通过调用我们的异步</span><span lang="EN-US"><span style="font-family: Times New Roman;">Session Beans</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">来解决，随着</span><span lang="EN-US"><span style="font-family: Times New Roman;">Session bean</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的增强，你可以简单的使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">@Asynchronouse</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">来标注你的</span><span lang="EN-US"><span style="font-family: Times New Roman;">session bean</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法，使其具备异步处理特性。现在我们再看看《</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB in Action</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">》中那个改进后的异步订单支付实例：</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<pre name="code" class="java">@Stateless
public class OrderBillingServiceBean implements OrderBillingService {
    ...

    @Asynchronous
    public void billOrder(Order order) {
        try {
            // Attempt to charge the order.
            bill(order);
            // Send email notification of billing success.
            notifyBillingSuccess(order);
            order.setStatus(OrderStatus.COMPLETE);
        } catch (BillingException be) {
            // Send email notification of billing failure.
            notifyBillingFailure(be, order);
            order.setStatus(OrderStatus.BILLING_FAILED);
        } finally {
            update(order);
        }
    }

    ...
}
</pre>
<p>&nbsp;</p>
<font style="mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';" face="宋体">
<p>
<p>&nbsp;</p>
</p>
</font></span></p>
<p>
<p><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">由于使用了</span><span lang="EN-US"><span style="font-family: Times New Roman;">@Asynchronous</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">标注，当客户端调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">OrderBillingService.billOrder()</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法时，调用会立即返回，而不会一直阻塞，直到</span><span lang="EN-US"><span style="font-family: Times New Roman;">billOrder</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法执行完毕后才正常退出应该方法。</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">容器会去确认哪些方法需要同步执行．或许你已经注意到了，异步方法的返回值是</span><span lang="EN-US"><span style="font-family: Times New Roman;">void</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">型的，或许对于绝大多数异步</span><span lang="EN-US"><span style="font-family: Times New Roman;">Session Bean</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法来说，这已经足够了．不过，</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB3.1</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">还支持</span><span lang="EN-US"><span style="font-family: Times New Roman;">java.util.concurrent.Future&lt;V&gt;</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">作为返回类型，其中</span><span lang="EN-US"><span style="font-family: Times New Roman;">V</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">表示异步调用后，返回结果的类型．万一你不熟悉异步的话，</span><span lang="EN-US"><span style="font-family: Times New Roman;">Future&lt;V&gt;</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">接口允许你做以下几类事：</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">取消异步调用</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">检查调用是否运行结束</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">查检是否有异常</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore">l<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">得到异步调用后的结果</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">想了解关于</span><span lang="EN-US"><span style="font-family: Times New Roman;">Future&lt;V&gt;</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">接口更多细节，请看</span><span lang="EN-US"><a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/Future.html" target="_blank"><span style="color: #800080; font-family: Times New Roman;">http://java.sun.com/javase/6/docs/api/java/util/concurrent/Future.html</span></a></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">现在我们来一个使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">Future&lt;V&gt;</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">作为返回类型的实例．在上文提到的</span><span lang="EN-US"><span style="font-family: Times New Roman;">billOrder</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法中，我们设置了</span><span lang="EN-US"><span style="font-family: Times New Roman;">order(</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">订单</span><span lang="EN-US"><span style="font-family: Times New Roman;">)</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">实体的状态值，并且对其进行更新操作．现在假设调用者自己想知道</span><span lang="EN-US"><span style="font-family: Times New Roman;">order</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的支付状态值是什么，我们可以重构上述代码如下：</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</p>
<font size="3"><font style="mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';" face="宋体">
<p>&nbsp;</p>
</font></font></span><font size="3">
<p>&nbsp;</p>
</font></span></p>
</p>
<p>&nbsp;</p>
<pre name="code" class="java">@Stateless
public class OrderBillingServiceBean implements OrderBillingService {
    ...

    @Asynchronous
    public Future&lt;OrderStatus&gt; billOrder(Order order) {
        try {
            // Attempt to charge the order.
            bill(order);
            // Send email notification of billing success.
            notifyBillingSuccess(order);
            return new AsyncResult&lt;OrderStatus&gt;(OrderStatus.COMPLETE);
        } catch (BillingException be) {
            // Send email notification of billing failure.
            notifyBillingFailure(be, order);
            return new AsyncResult&lt;OrderStatus&gt;
                (OrderStatus.BILLING_FAILED);
        }
    }

    ...
}
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">javax.ejb.AsyncResult&lt;V&gt;</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">实现了</span><span lang="EN-US"><span style="font-family: Times New Roman;">Future&lt;V&gt;</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">接口，并且将异步调用后的结果值作为其构造函数的参数．尽管如此，没有人可以阻止你去实现</span><span lang="EN-US"><span style="font-family: Times New Roman;">Future&lt;V&gt;</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">接口．异步调用来支持一些其它优雅的特性，比如说保证传输安全性和事务性等等．更多详细内容，可以参看草案．</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">你怎么看待异步</span><span lang="EN-US"><span style="font-family: Times New Roman;">Session Bean</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">调用特性？我个人觉得这很酷，你觉得还有必须增加其它特性吗？</span></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: 12pt; color: #ff6600;"><span style="font-family: Times New Roman;">EJB Lite</span></span><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">简介</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">许多人抱怨</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span><span lang="EN-US"><span style="font-family: Times New Roman;">JavaEE</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的一个主要原因在于：它通常提供的是一个激进的解决方案</span><span lang="EN-US"><span style="font-family: Times New Roman;">,</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">恨不得任何人都去尝试</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的所有特性．事实上，我们应该理解</span><span lang="EN-US"><span style="font-family: Times New Roman;">JavaEE</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">只是一个平台，必须具备全面性与普遍性，但实际开发并不一定要遵循这个原则．</span><span lang="EN-US"><span style="font-family: Times New Roman;">JavaEE6</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的</span><span lang="EN-US"><span style="font-family: Times New Roman;">Profiles</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">已经反射出了一些问题．</span><span lang="EN-US"><span style="font-family: Times New Roman;">Roberto Chinnici</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，作为</span><span lang="EN-US"><span style="font-family: Times New Roman;">JavaEE6</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">规范的领导人，已经在他的</span><span lang="EN-US"><span style="font-family: Times New Roman;">blog</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">发表了关于</span><span lang="EN-US"><span style="font-family: Times New Roman;">JavaEE6</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的文章：</span><span lang="EN-US"><a href="http://weblogs.java.net/blog/robc/archive/2008/02/profiles_in_the_1.html" target="_blank"><span style="font-family: Times New Roman;">http://weblogs.java.net/blog/robc/archive/2008/02/profiles_in_the_1.html</span></a></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">．简而言之，</span><span lang="EN-US"><span style="font-family: Times New Roman;">Profiles</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">所定义的</span><span lang="EN-US"><span style="font-family: Times New Roman;">JavaEE</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的子集适用于特殊目的，比如说，最低要求的</span><span lang="EN-US"><span style="font-family: Times New Roman;">Web Profile</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">已经向非常简单的</span><span lang="EN-US"><span style="font-family: Times New Roman;">Web</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">应用程序迈进了．</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">尤其当我们聚焦于</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">时，典型的</span><span lang="EN-US"><span style="font-family: Times New Roman;">web</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">项目基本上不太可能使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">remoting(</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">远程调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">)</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB Timer Service </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">以及</span><span lang="EN-US"><span style="font-family: Times New Roman;"> Message Driven Beans</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">．实际上，大部分</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">应用程序都是简单的利用注入，持久层管理，</span><span lang="EN-US"><span style="font-family: Times New Roman;">sateless session bean</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">以及声明式事务处理等．</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB Lite</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">正是试图紧跟上述需求，做到尽可能的减少</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">多于的特性．从一方面来说，有了</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB Lite</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">是一个简单并且轻量级的实现；从另一方面来说，学习</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB Lite</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">就意味着你只需要学习一些</span><span lang="EN-US"><span style="font-family: Times New Roman;">annotations</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，甚至如何配置都没有必要．下一代的</span><span lang="EN-US"><span style="font-family: Times New Roman;">JavaEE</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">应用程序服务器很可能情愿实现</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB Lite</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，而不是</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB3.1</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的规范．比如说，如果</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB Lite</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">成为事实，那么</span><span lang="EN-US"><span style="font-family: Times New Roman;">Spring</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">很可能会紧随其原有的</span><span lang="EN-US"><span style="font-family: Times New Roman;">Pitchfork</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">项目，实现</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB Lite</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">．　　</span><span lang="EN-US"><span style="font-family: Times New Roman;">(</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">注意：</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;"> <span lang="EN-US">Pitchfork</span></span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">由</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">SpringSoruce</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">BEA</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">联合发起，实现</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">JavaEE5.0</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">一个子集的项目．原文用的还是</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">Interface21</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，我在这里改成</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">SpringSoruce</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，以免大家产生误解</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">．当我看到这里时，我第一反应，</span><span lang="EN-US"><span style="font-family: Times New Roman;">Reza Rahman</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">不遗余力的力挺</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB Lite</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，很显然害怕因</span><span lang="EN-US"><span style="font-family: Times New Roman;">SpringSource</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span><span lang="EN-US"><span style="font-family: Times New Roman;">BEA</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的联手实现的</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">Pitchfork</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">再次成为</span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">新</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">EJB</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">子标准，</span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">从而再次陷入被动，即使不是</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">Pitchfork</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，</span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">那么出现别的</span><span style="color: #000000;"><span style="font-family: Times New Roman;">EJB</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">子集，专家组也不好受，毕竟多年不停的被别人牵着走的日子不好过啊．</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">当前</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB Lite</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">被提及的特性如下：</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore"><span style="font-size: small;">l</span><span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">包括</span><span lang="EN-US"><span style="font-family: Times New Roman;">Stateless Session Beans, Stateful Session Beans </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">以及</span><span lang="EN-US"><span style="font-family: Times New Roman;"> Singleton Session Beans.</span></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore"><span style="font-size: small;">l</span><span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">只有本地</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">接口，或者根本就不要</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore"><span style="font-size: small;">l</span><span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">不支持异步调用（你们觉得有必要加吗？）</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore"><span style="font-size: small;">l</span><span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">拦截器功能</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore"><span style="font-size: small;">l</span><span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">可声明式安全特性</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore"><span style="font-size: small;">l</span><span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">可声明式或编程式的事务处理．</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">（注：天啊，如果用过</span><span lang="EN-US"><span style="font-family: Times New Roman;">Spring</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的话，相信上述特性一定不会陌生．<span style="color: #ff6600;">难道</span></span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">EJB Lite</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的真正领导人是</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">Rod Johnson</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">你是怎么看待这个列表的？还应该再减少些什么吗？或者有什么东西还需要加入其中？你觉得你的应用程序最重要的是什么？作为一个参考，下面的表格对</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB Lite</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">进行比较：</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp; 
<table class="quote_div" style="width: 651px; height: 449px;" border="1">
<tbody>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><strong>Feature </strong></span></td>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><strong>EJB Lite </strong></span></td>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><strong>EJB </strong></span></td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Stateless beans</span></td>
<td>Y</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Stateful beans</span></td>
<td>Y</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Singleton beans</span></td>
<td>Y</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Message driven beans</span></td>
<td>&nbsp;</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">No interfaces</span></td>
<td>Y</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Local interfaces</span></td>
<td>Y</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Remote interfaces</span></td>
<td>&nbsp;</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Web service interfaces</span></td>
<td>&nbsp;</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Asynchronous invocation</span></td>
<td>&nbsp;</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Interceptors</span></td>
<td>Y</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Declarative security</span></td>
<td>Y</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Declarative transactions</span></td>
<td>Y</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Programmatic transactions</span></td>
<td>Y</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Timer service</span></td>
<td>&nbsp;</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">EJB 2.x support</span></td>
<td>&nbsp;</td>
<td>Y</td>
</tr>
<tr>
<td><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">CORBA interoperability</span></td>
<td>&nbsp;</td>
<td>Y</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
</span></span><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;&nbsp;</span></span>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">哪些特性还在日程上</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">到现在为止，我已经为大家一一介绍了</span><span lang="EN-US"><span style="font-family: Times New Roman;">Singleton beans, </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">可选的</span><span lang="EN-US"><span style="font-family: Times New Roman;">Session Beans</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">接口，</span><span lang="EN-US"><span style="font-family: Times New Roman;">Timer Service, </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">简化后的</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">打包机制，异步</span><span lang="EN-US"><span style="font-family: Times New Roman;">Session Bean</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">调用以及</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB Lite</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">．但仍然还有很多特性没有提到，专家组还在为这些特性进行激烈的讨论：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1;"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;"><span style="font-size: small;">l</span><span style="font-family: &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">通过</span><span lang="EN-US"><span style="font-family: Times New Roman;">Stateful Session Bean </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的</span><span lang="EN-US"><span style="font-family: Times New Roman;"> web service endpoints </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">支持</span><span lang="EN-US"><span style="font-family: Times New Roman;">Stateful web service</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">．</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1;"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;"><span style="font-size: small;">l</span><span style="font-family: &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">标准统一的</span><span lang="EN-US"><span style="font-family: Times New Roman;">JNDI</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">映射机构，而并不让各个供应商自己决定</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1;"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;"><span style="font-size: small;">l</span><span style="font-family: &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">支持</span><span lang="EN-US"><span style="font-family: Times New Roman;">JavaSE</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">环境也能运行</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB3.1</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，这样做的的一个最直接目的就是方便单元测试．</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">你是怎么看待这些特性的？如果你觉得它们很重要，请大胆发表你的意见，并给专家组发</span><span lang="EN-US"><span style="font-family: Times New Roman;">Email</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">．还有什么特性你想了解？你现在对这些特性的情况的了解是否现在越来越清晰了呢？我还会继承跟进本系列文章的．很多人提出，关于</span><span lang="EN-US"><span style="font-family: Times New Roman;">EJB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span><span lang="EN-US"><span style="font-family: Times New Roman;">WebBeans</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">整合，还有</span><span lang="EN-US"><span style="font-family: Times New Roman;">WebBeans</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">提供的</span><span lang="EN-US"><span style="font-family: Times New Roman;">enhanced DI</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">（依赖注入）特性也要介绍一下．到时候，我会介绍的，今天就至此为止，再见我的朋友们．</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span><span style="font-family: Times New Roman;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="mso-fareast-font-family: 'Times New Roman';" lang="EN-US"><span style="mso-list: Ignore;"><span>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="mso-fareast-font-family: 'Times New Roman';" lang="EN-US"></span></p>
<p><span style="mso-fareast-font-family: 'Times New Roman';" lang="EN-US">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">注</span><span lang="EN-US">1</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：</span> <span lang="EN-US">Fire-and-forget</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">来源于军事术语，其含义是指某些武器</span><span lang="EN-US">(</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">比如一些导弹</span><span lang="EN-US">)</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">当被发射出去之后就能够自行攻击目标，发射者无需再提供控制。而在消息的应用模式中，</span> <span lang="EN-US">Fire-and-forget</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">是指发出消息后，不再去处理与该消息相关的操作。</span></span></p>
</span></p>
</span></span></span></p>
</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://superleo.javaeye.com/blog/188621#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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>Thu, 01 May 2008 13:53:31 +0800</pubDate>
        <link>http://superleo.javaeye.com/blog/188621</link>
        <guid>http://superleo.javaeye.com/blog/188621</guid>
      </item>
          <item>
        <title>【Danny hui】运用抽象工厂模式自己动手写一个IoC</title>
        <author>kyo100900</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://superleo.javaeye.com">kyo100900</a>&nbsp;
                    链接：<a href="http://superleo.javaeye.com/blog/185955" style="color:red;">http://superleo.javaeye.com/blog/185955</a>&nbsp;
          发表时间: 2008年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">本文的作者</span><span lang="EN-US"><span style="font-family: Times New Roman;">Danny hui</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">似乎是</span><span lang="EN-US"><span style="font-family: Times New Roman;">TTS</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">上的新人，我从</span><span lang="EN-US"><span style="font-family: Times New Roman;">Google</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">搜不出一点关于本人的信息。从通过本文可以看出他对模式与</span><span lang="EN-US"><span style="font-family: Times New Roman;">IoC</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">有自己独到的见解，本文在</span><span lang="EN-US"><span style="font-family: Times New Roman;">TTS</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">上引发很多网友回帖，反响不一。那么我们现在来看看作者的</span><span lang="EN-US"><span style="font-family: Times New Roman;">IoC</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">之路吧。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;原文：http://www.theserverside.com/tt/articles/article.tss?l=InjectionwithAbstractFactory</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p><span style="font-size: small;"><font size="3">
<p><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">简介</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: #000000;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">本文重点讨论的是</span><span lang="EN-US"><span style="font-family: Times New Roman;">DI(</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">依赖注入</span><span lang="EN-US"><span style="font-family: Times New Roman;">)</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">结合设计模式中的</span><span lang="EN-US"><span style="font-family: Times New Roman;">Abstract Factory(</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">抽象工厂模式</span><span lang="EN-US"><span style="font-family: Times New Roman;">)</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的优势与弊端。该方式尤其适合以下场合：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt;"><span style="color: #000000;"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;">l<span style="font-family: &quot;Times New Roman&quot;;"><span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">通过</span><span lang="EN-US"><span style="font-family: Times New Roman;">dynamic parameters(</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">动态参数</span><span lang="EN-US"><span style="font-family: Times New Roman;">)</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">来建立一个</span><span lang="EN-US"><span style="font-family: Times New Roman;">local stateful</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt;"><span style="color: #000000;"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;">l<span style="font-family: &quot;Times New Roman&quot;;"><span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">当创建对象时抛出了</span><span lang="EN-US"><span style="font-family: Times New Roman;">checked exception</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">时进行相应处理，</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt;"><span style="color: #000000;"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;">l<span style="font-family: &quot;Times New Roman&quot;;"><span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">动态的封装对象</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: #000000;"><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">像</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;; mso-fareast-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Spring IoC</span><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">容器，</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;; mso-fareast-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">PicoContainer</span><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">以及</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;; mso-fareast-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Guice</span><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">都无法圆满的解决这些问题或者说它们几乎做不到！！！</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p><span style="color: #000000;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">用</span><span style="font-size: 12pt; color: #ff6600;"><span style="font-family: Times New Roman;">Abstractory Factory</span></span><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">模式来实现</span><span style="font-size: 12pt; color: #ff6600;"><span style="font-family: Times New Roman;">DI</span></span></p>
</span></p>
</span></p>
<font size="3"><font style="mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';" face="宋体">
<p>&nbsp;</p>
</font></font></span>
<p>&nbsp;</p>
</p>
</font></span>
<p>
<p>&nbsp;</p>
</p>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">现在通过下面两种途径来改进经典</span><span lang="EN-US"><span style="font-family: Times New Roman;">GoF</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中的</span><span lang="EN-US"><span style="font-family: Times New Roman;">Abstract Factory</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt;"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;"><span style="font-size: small;">l</span><span style="font-family: &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">一个工厂接口来代替抽象工厂类</span><span lang="EN-US"><span style="font-family: Times New Roman;">(</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">可行</span><span lang="EN-US"><span style="font-family: Times New Roman;">)</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt;"><span style="font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings;"><span style="mso-list: Ignore;"><span style="font-size: small;">l</span><span style="font-family: &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">每一个工厂方法的职责就是创建对象，并为其注入依赖</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">来看一个简单的例子吧：</span></span></p>
<p><img src="http://www.theserverside.com/tt/articles/content/InjectionwithAbstractFactory/clip_image001.gif" alt="" width="576" height="228" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在这里，</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentA</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">依赖于</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。为方便进行单元测试</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentAImpl</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类，接口</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的实现必须注入到</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentAImpl</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中去。下面看看采用</span><span lang="EN-US"><span style="font-family: Times New Roman;">Abstract Factory</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">模式完成依赖注入的</span><span lang="EN-US"><span style="font-family: Times New Roman;">Java</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">实现代码：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;//Abstract Factory for Dependency Injection<br />//Factory interface<br />public interface Module1ServiceFactory {<br />&nbsp;ComponentA getComponentA();<br />&nbsp;ComponentB getComponentB();<br />}</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">//Concrete factory<br />public class Module1ServiceFactoryImpl implements Module1ServiceFactory {<br />&nbsp;private ComponentA componentA;<br />&nbsp;private ComponentB componentB;<br />&nbsp;private Module1Servicefactory instance;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;private Module1ServicefactoryImpl() {}</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;public static synchronized Module1ServiceFactory getInstance() {<br />&nbsp;&nbsp;if (null == instance) {<br />&nbsp;&nbsp;&nbsp;instance = new Module1ServicefactoryImpl();<br />&nbsp;&nbsp;&nbsp;componentA = new ComponentAImpl();<br />&nbsp;&nbsp;&nbsp;componentB = new ComponentBImpl();<br />&nbsp;&nbsp;&nbsp;componentA.setComponentB(componentB);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return instance;<br />&nbsp;}</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;public ComponentA getComponentA() {<br />&nbsp;&nbsp;return componentA;<br />&nbsp;}</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;public ComponentB getComponentB() {<br />&nbsp;&nbsp;return componentB;<br />&nbsp;}<br />}</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">//Client<br />public class Client {</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;Module1ServiceFactory m1sf =<br />&nbsp;&nbsp;&nbsp;Module1ServicefactoryImpl.getInstance();<br />&nbsp;&nbsp;ComponentA componentA = m1sf.getComponentA();<br />&nbsp;&nbsp;componentA.operationA1();<br />&nbsp;}<br />}</p>
</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">延迟加载</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">延迟加载对象可以通过改变方法来实现，比如说我现在要稍微对</span><span lang="EN-US"><span style="font-family: Times New Roman;">getComponentA()</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">进行改动，请看：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;public synchronized ComponentA getComponentA() {<br />&nbsp;&nbsp;if (null == componentA) {<br />&nbsp;&nbsp;&nbsp;componentA = new ComponentAImpl();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return componentA;<br />&nbsp;}</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">当然我们的</span><span lang="EN-US"><span style="font-family: Times New Roman;">Module1ServiceFactoryImpl.getInstance()</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法也要进行相应的改动了，我们可以通过传递一个参数来判断</span><span lang="EN-US"><span style="font-family: Times New Roman;">Module1ServiceFactoryImpl.getInstance()</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">是否需要创建对象。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">非</span><span style="font-size: 12pt; color: #ff6600;"><span style="font-family: Times New Roman;">Singleton</span></span><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">作用域</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">上面的代码仅仅只是建立</span><span lang="EN-US"><span style="font-family: Times New Roman;">singleton</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象。如果需要在每次调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">getComponentA()</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span><span lang="EN-US"><span style="font-family: Times New Roman;">getComponentB()</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的时，都返回新创建的对象的话，我们可以对我们的</span><span lang="EN-US"><span style="font-family: Times New Roman;">Abstract Factory</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">进行下面的改动：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">//Concrete factory<br />public class Module1ServiceFactoryImpl {<br />&nbsp;private Module1ServiceFactory instance;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;private Module1ServiceFactoryImpl() {}</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;public static synchronized Module1ServiceFactory getInstance() {<br />&nbsp;&nbsp;if (null == instance) {<br />&nbsp;&nbsp;&nbsp;instance = new Module1ServiceFactoryImpl();<br />&nbsp;&nbsp;}</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">return instance;<br />&nbsp;}</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;public ComponentA getComponentA() {<br />&nbsp;&nbsp;ComponentA componentA = new ComponentAImpl();<br />&nbsp;&nbsp;ComponentB componentB = getComponentB();<br />&nbsp;&nbsp;componentA.setComponentB(componentB);<br />&nbsp;&nbsp;return componentA;<br />&nbsp;}</p>
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><br />&nbsp;public ComponentB getComponentB() {<br />&nbsp;&nbsp;return new ComponentBImpl();<br />&nbsp;}<br />}</p>
</span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类似的，我们还可以将一个</span><span lang="EN-US"><span style="font-family: Times New Roman;">singleton</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象注入到非</span><span lang="EN-US"><span style="font-family: Times New Roman;">singleton</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象中去。比如说，我们假设</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">此时是</span><span lang="EN-US"><span style="font-family: Times New Roman;">singleton</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentA</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">为非</span><span lang="EN-US"><span style="font-family: Times New Roman;">singleton</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，那么我们可以这样：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p>//Concrete factory<br />public class Module1ServiceFactoryImpl {<br />&nbsp;private Module1ServiceFactory instance;<br />&nbsp;private ComponentB componentB;</p>
<p>&nbsp;private Module1ServicefactoryImpl() {}</p>
<p>&nbsp;public static synchronized Module1ServiceFactory getInstance() {<br />&nbsp;&nbsp;if (null == instance) {<br />&nbsp;&nbsp;&nbsp;instance = new Module1ServiceFactoryImpl();<br />&nbsp;&nbsp;&nbsp;componentB = new ComponentBImpl();<br />&nbsp;&nbsp;}</p>
<p>return instance;<br />&nbsp;}</p>
<p>&nbsp;public ComponentA getComponentA() {<br />&nbsp;&nbsp;ComponentA componentA = new ComponentAImpl();<br />&nbsp;&nbsp;componentA.setComponentB(componentB);<br />&nbsp;&nbsp;return componentA;<br />&nbsp;}</p>
<p>&nbsp;public ComponentB getComponentB() {<br />&nbsp;&nbsp;return componentB;<br />&nbsp;}<br />}</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">将一个非</span><span lang="EN-US"><span style="font-family: Times New Roman;">singleton</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象注入到</span><span lang="EN-US"><span style="font-family: Times New Roman;">singleton</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象也不是做不到，但这种应用场合在现实世界中是非常罕见的。尽管如此，但在使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">dynamic parameters</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">赋级一个</span><span lang="EN-US"><span style="font-family: Times New Roman;">locallocal</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">变量时，创建一个非</span><span lang="EN-US"><span style="font-family: Times New Roman;">singleton</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象却很普遍。接下的话题，我们就谈谈这个。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">用</span><span style="font-size: 12pt; color: #ff6600;"><span style="font-family: Times New Roman;">dynamic parameters</span></span><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">为</span><span style="font-size: 12pt; color: #ff6600;"><span style="font-family: Times New Roman;">singleton</span></span><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">创建一个</span><span style="font-size: 12pt; color: #ff6600;"><span style="font-family: Times New Roman;">local stateful</span></span><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">这是所有</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">IoC</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">框架所面临的问题。</span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">下面的代码中，仍然假定</span><span style="color: #000000;"><span style="font-family: Times New Roman;">ComponentA</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">为</span><span style="color: #000000;"><span style="font-family: Times New Roman;">singletion</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p>&nbsp;&nbsp;public void operationA2() {<br />&nbsp;&nbsp;String s = aPrivateMethod();<br />&nbsp;&nbsp;int i = anotherMethod();<br />&nbsp;&nbsp;ComponentC componentC = new ComponentCImpl(s, i);<br />&nbsp;&nbsp;//do something else.<br />&nbsp;}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">这里，</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentAImpl</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">用到了</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentC</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">接口。虽然，为了更</span><span lang="EN-US"><span style="font-family: Times New Roman;">IoC</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，我们需要将它注入</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentC</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的实现，而不是直接硬编码在</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentAImpl.operationA2()</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法中去，这样做还有一个好处就是，方便单元测试。但问题来了，我们不能将</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentC</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">作为一个实例变量，因为它是有状态的</span><span lang="EN-US"><span style="font-family: Times New Roman;">(stateful)</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，它维持着某一个特定的客户端状态，不能与其它客户端进行共享。因此，不能使用常用的</span><span lang="EN-US"><span style="font-family: Times New Roman;">setter</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">或</span><span lang="EN-US"><span style="font-family: Times New Roman;">construtctor</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">注入方法来实现。</span></span></p>
<p class="MsoNormal" style="margin: 1.5pt 0cm 0pt; text-align: left; mso-pagination: widow-orphan; mso-margin-bottom-alt: auto;" align="left"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">Abstract Factory</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">模式的话，有两个方法可以解决这个问题。不过，都得改动</span><span lang="EN-US"><span style="font-family: Times New Roman;">Module1ServiceFactory</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">接口，添加下面方法：</span></span></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;ComponentC getComponentC(String s, int i);</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">请看我在</span><span lang="EN-US"><span style="font-family: Times New Roman;">Module1ServiceFactoryImpl</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中的实现代码：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">public ComponentC getComponentC(String s, int i) {<br />&nbsp;&nbsp;return new ComponentCImpl(s, i);<br />&nbsp;}<br />&nbsp;&nbsp;</p>
<p class="MsoNormal" style="margin: 1.5pt 0cm 0pt; text-align: left; mso-pagination: widow-orphan; mso-margin-bottom-alt: auto;" align="left"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">第一种方法就是将包含它的&ldquo;工厂&rdquo;注入到所需的</span><span lang="EN-US"><span style="font-family: Times New Roman;">local stateful</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象中去：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;private Module1ServiceFactory factory;<br />&nbsp;public void setModule1ServiceFactory(Module1ServiceFactory factory) {<br />&nbsp;&nbsp;this.factory = factory;<br />&nbsp;}</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">//ComponentAImpl.operationA2() becomes:</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;public void operationA2() {<br />&nbsp;&nbsp;String s = aPrivateMethod();<br />&nbsp;&nbsp;int i = anotherMethod();<br />&nbsp;&nbsp;ComponentC componentC = factory.getComponentC(s, i);<br />&nbsp;&nbsp;//do something else.<br />&nbsp;}<br /></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">缺点显而易见：</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentAImpl</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">现在与</span><span lang="EN-US"><span style="font-family: Times New Roman;">Module1ServiceFactory</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">绑定在一起了，如果要对</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentAImpl</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">进行单元测试的话，我们不得不</span><span lang="EN-US"><span style="font-family: Times New Roman;">mock</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">一个</span><span lang="EN-US"><span style="font-family: Times New Roman;">Module1ServiceFactory</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">实现。纵然有这个缺陷，但直接为</span><span lang="EN-US"><span style="font-family: Times New Roman;">stateful</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象注入&ldquo;工厂&rdquo;对象的方法也最为简单。类似的技术广泛的在</span><span lang="EN-US"><span style="font-family: Times New Roman;">J2EE</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">领域采用，比如说</span><span lang="EN-US"><span style="font-family: Times New Roman;">JPA</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，将我们将</span><span lang="EN-US"><span style="font-family: Times New Roman;">entity manager factory</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">可以注入到应用程序代码后，它就专门负责管理自身创建的</span><span lang="EN-US"><span style="font-family: Times New Roman;">application-managed entity</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。<span style="color: #ff6600;">（注：如果熟悉</span></span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">Hibernate</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的话，也可以将</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">entity manager factory</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">想象成</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">HibernateSessionFacory</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;"> application-managed entity</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">想象成</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">Session</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: #ff6600;"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: #ff6600;"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">第二种方法就是将方法抽出，移到抽象类中去，便于单元测试：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: #000000;"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: #000000;"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&nbsp;public abstract class AbstractComponentA implements ComponentA {<br />public void operationA2() {<br />&nbsp;&nbsp;String s = aPrivateMethod();<br />&nbsp;&nbsp;int i = anotherMethod();<br />&nbsp;&nbsp;ComponentC componentC = getComponentC(s, i);<br />&nbsp;&nbsp;//do something else.<br />&nbsp;}</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&nbsp;public abstract ComponentC getComponentC(String s, int i) ;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">}</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">public class ComponentAImpl extends AbstractComponentA {<br />&nbsp;public ComponentC getComponentC(String s, int i) {<br />&nbsp;&nbsp;return new ComponentCimpl(s, i);<br />&nbsp;}</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">}</span></p>
</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">这种方式类似于</span><span lang="EN-US"><span style="font-family: Times New Roman;">Springframework</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的方法注入</span><span lang="EN-US"><span style="font-family: Times New Roman;">(Metod Injection)</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，不过</span><span lang="EN-US"><span style="font-family: Times New Roman;">Spring</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">不需要传递</span><span lang="EN-US"><span style="font-family: Times New Roman;">dynamic parameter</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">也能创建</span><span lang="EN-US"><span style="font-family: Times New Roman;">stateful</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象。此时，单元测试可以不需要再实现任何</span><span lang="EN-US"><span style="font-family: Times New Roman;">mock</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">工厂。但是，这仍然是一个笨拙的办法。设想一下，我们的类里如果有</span><span lang="EN-US"><span style="font-family: Times New Roman;">10</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">个这样的</span><span lang="EN-US"><span style="font-family: Times New Roman;">local stateful</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象，那么我们需要提供</span><span lang="EN-US"><span style="font-family: Times New Roman;">10</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">个抽象方法，才能再次让单元测试变得简单，可是代价就造成是更加混乱的应用程序代码。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">Springframework</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">还可以通过使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">Java</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">反射机构还解决类似问题。但这更加复杂了，并且不适合正常应用程序编码工作。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">处理创建对象时抛出的</span><span style="font-size: 12pt; color: #ff6600;"><span style="font-family: Times New Roman;">checked exceptions</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">这个问题也是让</span><span lang="EN-US"><span style="font-family: Times New Roman;">IoC</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">容器头痛的。如果</span><span lang="EN-US"><span style="font-family: Times New Roman;">checked exception</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在对象创建时抛出，应用程序可能希望是能捕获<span style="color: #ff6600;">并且能够恢复</span><span style="color: #000000;">。我们来看一下这个关于</span></span><span style="color: #000000;"><span style="font-family: Times New Roman;">Web Service</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的需求实例：当客户端尝试建立</span><span style="color: #000000;"><span style="font-family: Times New Roman;">web service</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的</span><span style="color: #000000;"><span style="font-family: Times New Roman;">stub</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">时，并且此时服务端</span><span style="color: #000000;"><span style="font-family: Times New Roman;">web service</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">还不可用，那么客户端是能够捕获</span><span style="color: #000000;"><span style="font-family: Times New Roman;">stub</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">所抛出的异常，然后显示相应信息，并询问用户是否稍后继续再次连接。</span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">如果单纯用</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">IoC</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">容器的话，抛出具体指定的</span><span style="color: #ff6600;"><span style="font-family: Times New Roman;">checked exception</span></span><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">是很困难的。</span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">而手工代码却可以很轻松的解决这个问题&mdash;&mdash;我们可以简单的将&ldquo;工厂&rdquo;的</span><span style="color: #000000;"><span style="font-family: Times New Roman;">checked exceptions</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">抛出，留给应用程序代码去手工处理或者恢复它们。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: #000000;"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: #000000;"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: #000000;"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">动态封装对象</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: #000000;"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">很多场合下，一个接口对应着多个不同的实现类，类型实例就是设计模式中的策略模式。那么，用一个参数就可以决定具体哪个实现类应该被注入到相应的封装对象中去。然而使用基于</span><span style="color: #000000;"><span style="font-family: Times New Roman;">XML</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span><span style="color: #000000;"><span style="font-family: Times New Roman;">IoC</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">容器是静态封装对象，很难实现此功能。也许编程式的</span><span style="color: #000000;"><span style="font-family: Times New Roman;">IoC</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">容器可以解决动态依赖问题，但我要说的是我们的</span><span style="color: #000000;"><span style="font-family: Times New Roman;">Abstract Factory</span></span><span style="color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">则更简单直接，看看下面的代码就知道了：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: #000000;"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;//Concrete factory<br />public class Module1ServiceFactoryImpl {<br />&nbsp;...</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;public ComponentA getComponentA(int strategy) {<br />&nbsp;&nbsp;ComponentA componentA = new ComponentAImpl();<br />&nbsp;&nbsp;ComponentB componentB = getComponentB(strategy);<br />&nbsp;&nbsp;componentA.setComponentB(componentB);<br />&nbsp;&nbsp;return componentA;<br />&nbsp;}</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><br />&nbsp;public ComponentB getComponentB(int strategy) {<br />&nbsp;&nbsp;switch(strategy) {<br />&nbsp;&nbsp;&nbsp;case STRATEGYA:<br />&nbsp;&nbsp;&nbsp;&nbsp;return new StrategyA();<br />&nbsp;&nbsp;&nbsp;case STRATEGYB:<br />&nbsp;&nbsp;&nbsp;&nbsp;return new StrategyB();<br />&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;return null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;}<br />}</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">注意这里</span><span lang="EN-US"><span style="font-family: Times New Roman;">StrategyA</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span><span lang="EN-US"><span style="font-family: Times New Roman;">StrategyB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">共享实现了</span><span lang="EN-US"><span style="font-family: Times New Roman;">ComponentB</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">接口。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; color: #ff6600;"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">结束语</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">今天我们谈到的运用依赖注入和</span><span lang="EN-US"><span style="font-family: Times New Roman;">Absratct Factory</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">设计模式来解决下列问题：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt;"><span style="mso-bidi-font-family: 宋体;" lang="EN-US"><span style="mso-list: Ignore;"><span style="font-family: Times New Roman;"><span style="font-size: small;">１.</span><span style="font-family: &quot;Times New Roman&quot;;">&nbsp;&nbsp; </span></span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">通过动态参数，创建</span><span lang="EN-US"><span style="font-family: Times New Roman;">local stateful</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt;"><span style="mso-bidi-font-family: 宋体;" lang="EN-US"><span style="mso-list: Ignore;"><span style="font-family: Times New Roman;"><span style="font-size: small;">２.</span><span style="font-family: &quot;Times New Roman&quot;;">&nbsp;&nbsp; </span></span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">处理创建对象时抛出的</span><span lang="EN-US"><span style="font-family: Times New Roman;">checked exceptions</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt;"><span style="mso-bidi-font-family: 宋体;" lang="EN-US"><span style="mso-list: Ignore;"><span style="font-family: Times New Roman;"><span style="font-size: small;">３.</span><span style="font-family: &quot;Times New Roman&quot;;">&nbsp;&nbsp; </span></span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">动态封装注入对象</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">除此以外，该方法与其它</span><span lang="EN-US"><span style="font-family: Times New Roman;">IoC</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">容器相比，性能更好，毕竟是直接硬编码嘛。那么最大的缺点自然就是要手工写很多基础代码了，并且如果要延迟加载与主动加载之间来回切换的话，代码的改动量是很可观的。不过呢，这样的需求几乎是不存在的。</span></span></p>
<p class="MsoNormal" style="margin: 1.5pt 0cm 0pt; text-align: left; mso-pagination: widow-orphan; mso-margin-bottom-alt: auto;" align="left"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">可单元测试的关键点是基于接口而非实体类编程。这样的话</span><span lang="EN-US"><span style="font-family: Times New Roman;">mock</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象可以注入到任何需要注入的地方去。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">不管怎么样，有时候在我们的应用程序中，依赖注入是一个不得不解决的问题。所有</span><span lang="EN-US"><span style="font-family: Times New Roman;">IoC</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">容器以及手工的依赖注入解决方案都是专注于各自的领域&mdash;&mdash;</span><span lang="EN-US"><span style="font-family: Times New Roman;">Spring IoC</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">XML</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">配置，</span><span lang="EN-US"><span style="font-family: Times New Roman;">Google Guice</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">使用特殊的</span></span><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;">Java，我们的Abstract Factory也是如此。通过这些解决方案，我们可以避免应用程序中到处显现依赖的编码，