﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-大鸟的学习乐园-文章分类-JAVA EE6</title><link>http://www.blogjava.net/dunkbird/category/43242.html</link><description>路漫漫其修远兮，吾将上下而求索</description><language>zh-cn</language><lastBuildDate>Mon, 28 Dec 2009 08:57:40 GMT</lastBuildDate><pubDate>Mon, 28 Dec 2009 08:57:40 GMT</pubDate><ttl>60</ttl><item><title>J2EE中常用的名词进行解释</title><link>http://www.blogjava.net/dunkbird/articles/307345.html</link><dc:creator>大鸟</dc:creator><author>大鸟</author><pubDate>Sat, 26 Dec 2009 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/dunkbird/articles/307345.html</guid><wfw:comment>http://www.blogjava.net/dunkbird/comments/307345.html</wfw:comment><comments>http://www.blogjava.net/dunkbird/articles/307345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dunkbird/comments/commentRss/307345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dunkbird/services/trackbacks/307345.html</trackback:ping><description><![CDATA[web容器：给处于其中的应用程序组件（JSP，SERVLET）提供一个环境，使JSP,SERVLET直接更容器中的环境变量接**互，不必关注其它系统问题。主要有WEB服务器来实现。例如：TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。<br />
EJB容器：Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器，马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。<br />
JNDI：（Java Naming &amp; Directory Interface）JAVA命名目录服务。主要提供的功能是：提供一个目录系统，让其它各地的应用程序在其上面留下自己的索引，从而满足快速查找和定位分布式应用程序的功能。<br />
JMS：（Java Message Service）JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。<br />
JTA：（Java Transaction API）JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。<br />
JAF：（Java Action FrameWork）JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。<br />
RMI/IIOP:（Remote Method Invocation /internet对象请求中介协议）他们主要用于通过远程调用服务。例如，远程有一台计算机上运行一个程序，它提供股票分析服务，我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。
<img src ="http://www.blogjava.net/dunkbird/aggbug/307345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dunkbird/" target="_blank">大鸟</a> 2009-12-26 11:09 <a href="http://www.blogjava.net/dunkbird/articles/307345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>12票赞成1票反对 Java EE 6终获通过</title><link>http://www.blogjava.net/dunkbird/articles/307079.html</link><dc:creator>大鸟</dc:creator><author>大鸟</author><pubDate>Wed, 23 Dec 2009 13:36:00 GMT</pubDate><guid>http://www.blogjava.net/dunkbird/articles/307079.html</guid><wfw:comment>http://www.blogjava.net/dunkbird/comments/307079.html</wfw:comment><comments>http://www.blogjava.net/dunkbird/articles/307079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dunkbird/comments/commentRss/307079.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dunkbird/services/trackbacks/307079.html</trackback:ping><description><![CDATA[Java企业版早已在行业中确立了主导地位，但Java EE 6的正式规范——Java规范请求316（JSR 316）却迟迟得不到批准。新的规范不出所料的带来了Profiles功能，可以为某些特定功能建立配置文件，例如为Web开发者建立Web Profiles，另外其他配置文件比如电信配置等等也在预料之中。Java EE 6还包括让部分平台成为可选的平台修剪功能，以及支持脚本语言与REST等其他功能。51CTO之前曾报道过《Java EE 6新特性尝鲜：EJB 3.1重要变化总览》<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;过去8年以来，Java EE平台已经迅速的长大并且成熟，现在它已经可以覆盖企业和Web应用开发的各种需求，&#8221;JSR 316在官方声明中说，&#8220;此外，Java EE平台已经孕育出一个充满活力的社区和市场，带来了与平台兼容的附加技术、框架和应用，这其中有许多技术为Java平台提供了原本缺少的一些功能，而其他一些提供了平台的替代方案。此次发布的一个主要主题就是要拥抱和支持这些技术，把它们变为Java EE大家庭的一部分，同时我们还要继续简化平台，让它能够吸引更多的开发者。为此，我们提出这个版本需要实现的两项目标——可扩展性和Profiles功能。&#8221; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 投票结果最终批准了JSR 316，其中有12票赞成，1票反对，1票无效，另有2票弃权。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 投了赞成票的包括Sun、Oracle（正在试图并购Sun的过程之中）、IBM、Google和Red Hat。Apache基金会依旧对规范投了反对票，原因依然是其Harmony项目中长期与Sun存在的技术兼容性工具包的争端，但Apache基金会称其投反对票的目的并非是不认可JSR 316的技术价值。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM投了赞成票，并且同样也作了表态，它表示投票是因为JSR的技术价值，但对其许可条款并不认同。IBM又一次表达了对平台支持注入编程的担心，并承诺将会继续支持单一的综合可扩展注入编程模式的开发。&#8220;我们仍然担心平台支持注入会给社区带来不必要的麻烦，&#8221;IBM表示。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAP和Intel投了弃权票，而SpringSource没有投票。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAP在声明中表示欢迎Java社区的进展并且将一如既往的支持Java开发，但对Sun作为Java EE 6规范的领头人没有能够按期带来承诺中的Java EE 6 TCK&#8220;充分许可条款&#8221;感到失望。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 投了赞成票的Red Hat则在电子邮件中说它的JBoss Seam Web 2.0应用框架已被列入到Java EE 6中。<br />
<img src ="http://www.blogjava.net/dunkbird/aggbug/307079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dunkbird/" target="_blank">大鸟</a> 2009-12-23 21:36 <a href="http://www.blogjava.net/dunkbird/articles/307079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java EE 6开发三剑客:JSF 2.0、EJB 3.1和JPA 2.0</title><link>http://www.blogjava.net/dunkbird/articles/307078.html</link><dc:creator>大鸟</dc:creator><author>大鸟</author><pubDate>Wed, 23 Dec 2009 13:28:00 GMT</pubDate><guid>http://www.blogjava.net/dunkbird/articles/307078.html</guid><wfw:comment>http://www.blogjava.net/dunkbird/comments/307078.html</wfw:comment><comments>http://www.blogjava.net/dunkbird/articles/307078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dunkbird/comments/commentRss/307078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dunkbird/services/trackbacks/307078.html</trackback:ping><description><![CDATA[JSF 2.0 尽管 Java 在展示层框架上竞争的非常激烈，但 JSF 仍然固守着自己的领地。虽然有很多关于 JSF 的易用性和健壮性的质疑声，但 JSF2.0 就是为正面解决这些问题而提出来的，它的易用，创新以及可扩展的特性包括： JSF 正式将 Facelets 作为视图技术。也许你不熟悉 Facelets ，它也是一个与 JSF 结合默契的开源视图技术。因此，与 JSP 不同的是 Facelets 更适合 JSF 的组件模型以及生命周期的概念。当然，也许 Facelets 最强大的特性就是在用 mark-up 来代替 java 代码创建自定义的组件。创建自定义组件的复杂度也许是开发者对 JSF 抱怨最多的地方了。 JSF2.0 通过使用标签为 Java EE 5 提供了基于 annotation 驱动的配置特性（比如说可以使用 @ManagedBean 和 @ManagedProperty ）。这也意味着可以一定程度上的减少 faces-config.xml 文件的大小，不过像在 navigation 这些结点的配置在 XML 文件还是不能少。 JSF2.0 为适应 AJAX 而改变了自身的生命周期，只需要局部页面的交由 AJAX 事件处理。这个特性使得 JSF+AJAX 的组合更加自然。 JSF2.0 现在内置了优秀的资源处理器。对 images ， JavaScript 文件以及 CSS 样式等都表现出众。它可以对通过逻辑名称，资源分组以及版本等方式来更好的引用资源。 除上述特性外， JSF2.0 还包括许多其它方便的改变。比如说支持事件，支持 RAILS_ENV 的开发风格 （ 就是 ROR） ，支持对标准组件集进行扩展。你可以通过下面的链接来看看 JSF2.0 的公开草案：http://jcp.org/en/jsr/detail？id=314 EJB 3.1 EJB 在 Java EE 5 就已经经历过了非常大的改动。也许看似不可能，但实际上 EJB3.0 还是在社区中广泛得到认可，并且采纳它的人也在不断增长。而这一切也许是因为我们过度的认为需要怎么怎么简化 Java EE 5 才取得这样的成绩。比如说，对 JBoss Seam 的兴趣和 GlassFish 的热情都是重要的关键因素。 EJB3.1 的目标就是在增加业务组件时，继续让 EJB 变得尽可能简单。下面是对 EJB3.1 特性的高度概括： 原本需要甚至实现 Session Beans 的业务接口变得可选了，不再强迫要求实现。在使用 Session Beans+JSF+WebBeans 的场景下尤其有用。 EJB3.1 增加了 Singleton Beans 的概念。因为人们更倾向于管理共享的应用程序状态，需要保证是完全线程安全的模型。此外， EJB3.1 新增的声明式的并发控制也更加灵活。 EJB3.1 一个可圈可点的的强大特性就是支持 cron 风格的 scheduling .除目前基于 timer API 的调度计时器外，声明式和编程式的 cron 风格的 scheduling API 也加入了进来。 另一个强大的特性就是可以通过使用 @Asynchronous 标注来对 Session Bean 的方法进行异步调用。你甚至还通过它来控制异步 EJB 方法从而返回一个 java.util.concurrent.Future 对象。 EJB3.1 Lite 概念的逐渐引入形成了一个 EJB API 的子集，并在 Web Profile 中得到应用。只不过 EJB Lite 包含了像事务处理和安全这样的特性，而那些消息机制，远程调用以及 scheduling 等非必须的自然没有必要加入其中。除上述列表所述特性外， EJB3.1 的特性还包括：括直接将 EJB 打包成 war 文件，可运行在 embedded 的容器中便于 Java SE 环境进行 JUnit 测试，使用统一的标准化全局 JNDI 命名方式。 EJB3.1 的公开草案可从以下链接获得： http://jcp.org/en/jsr/detail？id=318 JPA 2.0 到 Java EE 6 的时候， JPA 已经彻底从 EJB 中分离，形成自己的体系 （EJB3.0 已经将 JPA 分离出去了 ） . JPA 的成功是毫无疑问的。它广泛得到社区的采纳和一流供应商的支持。本来我们担心 EJB2.* 的 Enity Beans 垮台可能无法让 Java EE 再次引领持久层的标准，一个重要成功的因素就是 Gaving King 和 JBoss 社区毫不含糊的支持。 JPA2.0 的目标就是要在这次成功的基础上再接再厉，填补更多的空白，再创多的创新： JPA2.0 加入了大量必须的 ORM 映射增强特性，包括：支持通过使用 @ElementCollection 标注来增强 collections， maps 和 lists（ 这里不是指实体之间的关联关系 ） 集合，支持 map 的单向 one-to-many 关联 （JPA1.0 只允许双向 one-to-many 关联 ） . EntityManager 和 Query API 都得到改进。比如说，现在可以从结果集中直接取得第一条记录 （JPA1.0 只允许从一个 unique 结果集中反回单个记录 ） ，指定 query 结果集的最大值，访问各个供应商的底层实体对象 manager 或 query ，最后就是加入悲观锁 （JPA1.0 只支持乐观锁 ） . JPQL 也提供类似于 SQL 的 CASE ， NULLIF ， COALESCE 等函数 . JPA2.0 应广大开发者要求增加了 Criteria API .要是你对 Hibernate 或 TopLink 的 Criteria API 不熟悉的话，可以将它想像成一个以 Java 为中心的面向对象，线程安全并可以与 JPQL 划上等号的一组 API .这组 API 适合于编写复杂的动态查询语句，还可避免解析 JPQL 语句时，所抛出的运行期异常。 更完整的 JAP2.0 特性还包括：标准的二级缓存，标准的 JDBC properties ，指定超时时间等等。你可以随时通过下面的 JSR 站点看看关于 JPA2.0 公开草案的更多细节： http://jcp.org/en/jsr/detail？id=317
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/dunkbird/aggbug/307078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dunkbird/" target="_blank">大鸟</a> 2009-12-23 21:28 <a href="http://www.blogjava.net/dunkbird/articles/307078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJO应用框架：Spring Vs. EJB 3.0(转)</title><link>http://www.blogjava.net/dunkbird/articles/306975.html</link><dc:creator>大鸟</dc:creator><author>大鸟</author><pubDate>Wed, 23 Dec 2009 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/dunkbird/articles/306975.html</guid><wfw:comment>http://www.blogjava.net/dunkbird/comments/306975.html</wfw:comment><comments>http://www.blogjava.net/dunkbird/articles/306975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dunkbird/comments/commentRss/306975.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dunkbird/services/trackbacks/306975.html</trackback:ping><description><![CDATA[<div class="tit">POJO应用框架：Spring Vs. EJB 3.0</div>
<div class="date">2009年02月27日 星期五 21:27</div>
<table style="table-layout: fixed; width: 100%">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">爱因斯坦曾经说：&#8220;任何事情都应该越简单越好，而不是比较简单。&#8221;实际上，科学真理的目的就是在假设的前提下去简化一个理论，这样，人们可以去关注真正重要的问题。在企业软件开发中，道理是一样的。<br />
            　　简化企业软件开发的一个关键是，提供一个这样的应用框架：它可以使开发人员不用关注于很多复杂的问题，比如事务处理、安全和持久化等。一个设计良好的框架将提升代码的可复用性，提高开发者的效率，并得到更高质量的软件。然而，目前J2EE 1.4下的EJB 2.1 框架被广泛认为是设计较差而且过度复杂的。不满足于EJB2.1框架，JAVA开发者使用了很多其他的中间件服务产品。最值得关注的是，以下两个框架吸引了大量开发者的兴趣和积极反馈。这两个框架很可能成为未来企业JAVA应用开发框架的选择。<br />
            　　Spring框架是一个广受欢迎的但是非标准的开源框架。它主要由Interface21公司开发和控制。Spring框架的体系结构是基于注射依赖（DI）模式。Spring框架使用了大量的XML配置文件，它可以独立应用，或者在现有的应用服务器上工作。<br />
            　　EJB 3.0框架是JCP定义的并且被所有主流J2EE提供商支持的标准框架。EJB 3.0规范的预发布版本目前已经有开源的和商业的实现，如JBOSS和ORACLE。EJB 3.0大量使用了JAVA注解（Java annotations，是JDK1.5提供的新功能。译者注）<br />
            　　这两个框架有着一个共同的核心设计理念：它们的目标是为松耦合的POJO类提供中间件服务。框架通过在运行时截取执行环境，或将服务对象注射给POJO类的方式，将应用服务和POJO类&#8220;连接&#8221;起来。POJO类本身并不关注如何&#8220;连接&#8221;，而且也很少依赖于框架。这样，开发者可以将注意力集中在业务逻辑上，可以对他们的POJO类进行与框架无关的单元测试。并且，由于POJO类不需要继承框架的类或实现框架提供的接口，开发者可以在更加灵活性的基础上构建继承体系，和搭建应用。<br />
            　　尽管有着共同的理念，但这两个框架采取了不同的方式来提供POJO服务。由于已经出版了大量的比较Spring与EJB2.1或者EJB3.0与EJB2.1的书籍和文章，而没有关于比较Spring和EJB3.0的认真研究，因此，本文将考察它们之间几个关键的不同，讨论他们优缺点。本文谈到的主题同样适用于其他不太有名的但同样提供&#8220;松耦合POJO&#8221; 设计的企业中间件框架。我希望，这篇文章可以帮助你选者最合适的你需求的框架。<br />
            <strong>提供商无关性<br />
            </strong>　　开发者选择JAVA平台的一个最重要的原因就是它的提供厂商无关性。EJB 3.0是一个被设计为对提供商没有依赖性的开放的标准。EJB 3.0规范由企业JAVA社区的主流开源组织和厂商共同编写和支持的。EJB 3.0框架使开发者的应用程序实现可以独立于应用服务器。比如，JBoss的EJB 3.0的实现是基于Hibernate的，Oracle的EJB 3.0实现是基于TopLink的，但是，在JBoss或者Oracle上跑应用程序，开发者既不需要去学习Hibernate，也不需要学习TopLink提供的独特API。厂商无关性使EJB 3.0框架区别于当前其他任何的POJO中间件框架。<br />
            　　然而，就象很多EJB 3.0的批评者很快指出的一样，目前EJB 3.0规范正在编写还未完全完成最终发布版。很有可能，还需要1至2年，EJB 3.0才会被主流J2EE厂商完全接受。但是，就算你的应用服务器本身不支持EJB 3.0，你也可以通过下载和安装一个&#8220;可嵌入的&#8221; EJB 3.0产品，来使你的应用服务器支持EJB 3.0应用。比如，JBoss&#8220;可嵌入的&#8221; EJB 3.0产品是开源的，它可以运行在任何兼容J2SE-5.0环境下（如你的应用服务器），目前处于Beta版测试中。其他厂商同样可以快速发布他们自己的可嵌入EJB 3.0产品，特别是规范中&#8220;数据持久化&#8221;部分。<br />
            　　另一方面，Spring一直是一个非标准的技术，而且在可以预计的未来仍将如此。尽管你在任何应用服务器都上可以使用Spring框架，但基于Spring的应用仍然被限制于Spring本身和在你的应用中使用到的Spring提供的各种特别服务。<br />
            　　由于Spring框架是一个开源项目，因此，它使用的配置文件XML格式和开发接口都是私有的。当然，这种限制不仅体现在Spring框架中，其他任何非标准产品都会有这种限制。但是，你的Spring应用的长期生存能力将依赖于Spring项目本身（或者说Interface 21公司，因为它雇佣了大多数的Spring核心开发人员）。并且，如果你使用了Spring提供的特殊服务，如Spring事务管理器或者Spring MVC，你同样被限制于Spring提供的API。<br />
            　　并且，Spring应用是知道后端服务提供者的（即应用程序是知道服务提供者的，这样应用程序将会在一定程度上依赖于服务提供方：译者注）。例如，对于数据持久化服务，Spring框架提供了不同的DAO和模板Helper类，用于JDBC、Hibernate,、iBatis和JDO。这样，假如你需要改变一个Spring应用的持久化服务提供者（如，从JDBC换到Hibernate），你将需要重构你的系统应用代码，来使用新的Helper类。<br />
            <strong>服务整合</strong><br />
            　　Spring框架是建立在应用服务器和服务库之上，它的服务整合代码（如数据访问模板和Helper类）是基于框架的，并暴露给应用开发者。相反，EJB 3.0框架是紧密整合到应用服务器中的，它的服务整合代码是封装在一个标准的接口下的。<br />
            　　因此，EJB 3.0厂商可以轻松的优化整体性能和开发者体验。如，在JBoss的EJB 3.0实现中，当你通过实体管理器持久化一个实体BEAN POJO时，Hibernate session事务将在JTA事务提交时自动提交。通过使用简单的@PersistenceContext注解（例子参看后面文章），你可以甚至可以将实体管理器和其下的Hibernate事务绑定到一个有状态的session bean上。应用程序事务可以在一个session中跨越多个线程，在事务性的WEB应用中这是非常有用的，如多页面的购物车。<br />
            　　基于EJB 3.0 框架、Hibernate、和JBoss 内部Tomcat的紧密整合，上面提到的简单的整合的编程接口是可能的。Oracle的EJB 3.0框架和它内部的Toplink持久服务可以达到同样层次的整合。<br />
            　　EJB 3.0中整合服务的另一个好例子是集群支持。假如你部署一个EJB 3.0应用到一个集群服务器，所有的故障切换、负载均衡、分布式缓存、和状态复制服务对于应用程序来说，都是自动完成的。集群服务被隐藏在EJB 3.0编程接口之下，对于EJB 3.0开发者来说，这些服务都是完全透明的。<br />
            　　在Spring中，优化框架和服务之间交互更加困难一些。例如，想要用Spring的声明式事务服务来管理Hibernate事务，必须在XML配置文件中明确的配置Spring的事务管理器（TransactionManager）和Hibernate SessionFactory对象。Spring应用开发者必须自己管理跨越多个HTTP请求的事务。并且，没有简单的方法可以在Spring应用中实现集群服务<br />
            <strong>服务聚合的灵活性</strong><br />
            　　由于Spring中的服务整合代码是作为编程接口暴露给应用开发者的，因此开发人员可以根据需要来聚合多个服务。这个特性使你可以集成一个你自己的&#8220;轻量&#8221;级应用服务器。Spring的一个通常的用法是将Tomcat和Hibernate连接起来来支持简单的数据库驱动的WEB应用程序。在这种情况下，Spring本身提供了事务管理服务，Hibernate提供了持久化服务，这种设置本身就创建了一个小型的应用服务器。<br />
            　　通常，EJB 3.0应用服务器不提供给开发者这种按照你的需要来选择服务的灵活性。大多数情况，你会得到一系列已经预先打包好的特性，其中有些你可能是不需要的。然而，如果应用服务器提供了模块内部的独特设计，就象JBOSS一样，你可以不去关心这些不必要的特性。在任何情况下，去定制一个全功能的应用服务器并不是一个琐碎而没有意义的工作。<br />
            　　当然，如果一个应用不是一个单一的结点，你将需要连接多个应用服务器提供的服务（如资源池、消息队列和集群）。这种情况下，从总的资源消耗上看，Spring框架就和任何EJB 3.0方案一样是&#8220;重量级&#8221;的。<br />
            　　为了进行容器外的单元测试，Spring的灵活的服务聚合也可以来连接假对象，来替代真的服务对象。在EJB 3.0应用中，大多数的组件都是简单POJO，他们可以容易进行容器外的单元测试。但是，如果要测试与容器服务相关的服务对象（如持久化实体管理器），更好的方式是进行容器内的测试，因为这样比使用假对象来替代的方式更加容易，更加健壮，而且更加准确。<br />
            <strong>XML vs. 注解<br />
            </strong>　　从应用开发者的角度来看，Spring的编程接口主要基于XML配置文件，而EJB 3.0则大量的使用了JAVA注解。XML文件可以表达复杂的关系，但是它们更加冗长而且不健壮。注解的方式很简单明了，但是很难去表达复杂的或者继承性的结构。<br />
            　　Spring和EJB 3.0分别选择了XML和注解方式，这取决于框架的体系结构：由于注释只能描述相当少的配置信息，只有一个预先整合好的框架（如大多数重要事情已经在框架中实现了）才能大量的使用注释作为它的配置选项。象我们讨论的一样，EJB 3.0满足了这些要求，而Spring作为一个一般的注射依赖框架，它没有做到这一点。<br />
            　　当然，由于EJB 3.0和Spring相互学习了很多特性，所以，它们都在某种层次上支持XML和注释。例如，EJB 3.0中可以应用XML配置文件来作为一个选择性的机制，用来改变注释的默认行为。注释也可以用来配置一些Spring服务。<br />
            　　研究XML和注释直接区别的最好的方式就是通过例子。在下面的几节中，我们将一起看一下EJB 3.0和Spring是如何为应用程序提供关键服务的。<br />
            <strong>声明式服务</strong><br />
            　　EJB 3.0和Spring都将运行时服务（如事务管理、安全、日志、消息、和信息服务）连接给应用程序。由于这些服务同应用程序的业务逻辑并不是直接相关的，因此，它们不被应用程序本身来管理。相反，这些服务被服务容器（如EJB 3.0和Spring）以不可见的方式在运行时提供给应用程序。开发人员（或系统管理员）通过配置来告诉容器什么时候，以怎样的方式来应用这些服务。<br />
            　　EJB 3.0通过JAVA注解的方式来配置声明式服务，Spring则通过XML配置文件来完成。大多数情况下，EJB 3.0 的注解方式是应用这种服务的更加简单和优美的方式。下面是一个在EJB 3.0中对一个POJO的方法使用事务管理服务的例子。<br />
            　　public class Foo {<br />
            　　&nbsp;&nbsp;&nbsp; @TransactionAttribute(TransactionAttributeType.REQUIRED)<br />
            　　&nbsp;&nbsp;&nbsp; public bar () {<br />
            　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // do something ...<br />
            　　&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
            　　}<br />
            　　你可以对一段代码声明多个属性，并应用多个服务。下面是一个对EJB 3.0中POJO类同时使用事务管理服务和安全服务的例子。<br />
            　　@SecurityDomain("other")<br />
            　　public class Foo {<br />
            　　&nbsp;&nbsp;&nbsp; @RolesAllowed({"managers"})<br />
            　　&nbsp;&nbsp;&nbsp; @TransactionAttribute(TransactionAttributeType.REQUIRED)<br />
            　　&nbsp;&nbsp;&nbsp; public bar () {<br />
            　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // do something ...<br />
            　　&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
            　　}<br />
            　　使用XML指定代码属性和配置声明服务将导致冗长的和不桅顶的配置文件。下面是Spring应用中一个XML元素的例子，它用来在Foo.bar()方法上应用一个非常简单的Hibernate事务。<br />
            &lt;!-- Setup the transaction interceptor --&gt;<br />
            &lt;bean id="foo" <br />
            class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;property name="target"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class="Foo"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;property name="transactionManager"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="transactionManager"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;property name="transactionAttributeSource"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="attributeSource"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &lt;/bean&gt;<br />
            &lt;!-- Setup the transaction manager for Hibernate --&gt;<br />
            &lt;bean id="transactionManager" <br />
            class="org.springframework.orm.hibernate.HibernateTransactionManager"&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- you need to setup the sessionFactory bean in yet another XML element --&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="sessionFactory"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &lt;/bean&gt;<br />
            &lt;!-- Specify which methods to apply transaction --&gt;<br />
            &lt;bean id="transactionAttributeSource" <br />
            class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource"&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;property name="properties"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;props&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="bar"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/props&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &lt;/bean&gt;<br />
            　　XML文件的复杂程度将随着你对同一个POJO类增加的拦截器的数量程几何增长。意识到了仅使用XML配置文件的限制性，Spring支持在JAVA源代码中使用Apache Commons metadata来指定事物属性。在最新的Spring 1.2中，JDK-1.5风格的注释也被支持。为了使用事务元数据，你需要为上面例子中的AttributesTransactionAttributeSource 改变一个transactionAttributeSource bean，并且增加一个附加的对元数据拦截器的设置。<br />
            &lt;bean id="autoproxy"<br />
            class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/&gt;<br />
            &lt;bean id="transactionAttributeSource"<br />
            class="org.springframework.transaction.interceptor.AttributesTransactionAttributeSource"<br />
            &nbsp;&nbsp;&nbsp; autowire="constructor"/&gt;<br />
            &lt;bean id="transactionInterceptor"<br />
            &nbsp;&nbsp;&nbsp; class="org.springframework.transaction.interceptor.TransactionInterceptor"<br />
            &nbsp;&nbsp;&nbsp; autowire="byType"/&gt;<br />
            &lt;bean id="transactionAdvisor"<br />
            &nbsp;&nbsp;&nbsp; class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"<br />
            &nbsp;&nbsp;&nbsp; autowire="constructor"/&gt;<br />
            &lt;bean id="attributes" <br />
            class="org.springframework.metadata.commons.CommonsAttributes"/&gt;<br />
            　　<br />
            　　当你有许多事务方法时，Spring元数据简化了transactionAttributeSource元素。但是它没有解决XML配置文件的根本问题：仍然需要冗长的、易错的事务拦截器，事务管理器，和事务属性。<br />
            注射依赖<br />
            　　中间件容器的一个主要优点是它们使得程序开发人员可以去构建松耦合的应用程序。服务使用者仅仅需要知道服务接口就可以使用服务。容器把具体的服务实现实例化，然后将它们提供给服务使用者。这样，容器可以在可替换的服务实现之间进行切换，而不改变服务接口和服务使用者代码。<br />
            　　注射依赖模式是实现松耦合应用程序的一个最好的方式。比起以前的方式，如通过JNDI进行查找或回调容器，注射依赖模式更容易使用，而且更加优美。使用注射依赖模式，框架扮演了构建服务的对象工厂角色，然后根据运行时的配置，把这些服务对象注射到应用程序的POJO类中。从程序开发人员的角度看，作为客户端使用者的POJO在需要使用服务对象前就自动的得到了它们。<br />
            　　Spring 和 EJB 3.0都提供了大量的DI模式支持。但是，它们之间也有着根本的不同。Spring支持了通常意义上的但是复杂的基于XML配置文件的注射依赖API；EJB 3.0支持的注射大多数通用服务对象（如，EJB和容器对象）和JNDI对象，它通过简单的JAVA注解来完成。<br />
            　　EJB 3.0的注射注解相当的简洁易用。@Resource标签注射大多数的通过服务对象和JNDI对象。下面的例子显示了如何将JNDI提供的服务器缺剩数据源对象注射给一个POJO的一个字段。DefaultDS是这个数据源的JNDI名字。myDb 变量在第一次被使用前就自动被赋予了正确的值。<br />
            　　public class FooDao {<br />
            　　&nbsp;&nbsp;&nbsp; @Resource (name="DefaultDS")<br />
            　　&nbsp;&nbsp;&nbsp; DataSource myDb;<br />
            　　&nbsp;&nbsp;&nbsp; // Use myDb to get JDBC connection to the database<br />
            　　}<br />
            　　在EJB 3.0中，注释@Resource不仅可以直接注射给属性变量，它也可以通过setter方法来完成注射。下面的例子将一个session上下文对象通过setter方法注射给使用者。应用程序不用显示的调用setter方法，在任何其他方法被调用前容器将调用setter方法完成注射。<br />
            　　@Resource <br />
            　　public void setSessionContext (SessionContext ctx) { <br />
            　　&nbsp;&nbsp;&nbsp; sessionCtx = ctx; <br />
            　　} <br />
            　　对于更复杂的服务对象，还有一些特殊的注射注解。例如，@EJB 注解被用来注射EJB stubs，@PersistenceContext注解被用来注射实体管理器对象，这些对象负责处理EJB 3.0实体Bean的数据访问操作。 下面的例子给出如何将一个实体管理器注射到一个有状态Session Bean中。@PersistenceContext注解的类型属性描述了被注射的的实体管理器有一个扩展的事务容器：它不会随着JTA事务管理器自动提交事务，因此它可以应用在当session中有多次操作的应用事务管理时。<br />
            　　@Stateful<br />
            　　public class FooBean implements Foo, Serializable {<br />
            　　&nbsp;&nbsp;&nbsp; @PersistenceContext(<br />
            　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type=PersistenceContextType.EXTENDED<br />
            　　&nbsp;&nbsp;&nbsp; )<br />
            　　&nbsp;&nbsp;&nbsp; protected EntityManager em;<br />
            　　&nbsp;&nbsp;&nbsp; public Foo getFoo (Integer id) {<br />
            　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (Foo) em.find(Foo.class, id);<br />
            　　&nbsp;&nbsp;&nbsp; }<br />
            　　}
            <p>　　EJB 3.0 规范定义了可以通过注解来被注射使用的服务器资源。但是，它不支持用户自定义的POJO类之间的相互注射。<br />
            　　在Spring中，为了将服务对象注射到你的POJO类中，你首先需要定义一个setter方法(或有参数的构造函数) 。下面的例子演示了 POJO 类中一个Hibernate session 工厂的属性。<br />
            　　public class FooDao {<br />
            　　&nbsp;&nbsp;&nbsp; HibernateTemplate hibernateTemplate;<br />
            　　&nbsp;&nbsp;&nbsp; public void setHibernateTemplate (HibernateTemplate ht) {<br />
            　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hibernateTemplate = ht;<br />
            　　&nbsp;&nbsp;&nbsp; }<br />
            　　&nbsp;&nbsp;&nbsp; // Use hibernateTemplate to access data via Hibernate<br />
            　　&nbsp;&nbsp;&nbsp; public Foo getFoo (Integer id) {<br />
            　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (Foo) hibernateTemplate.load (Foo.class, id);<br />
            　　&nbsp;&nbsp;&nbsp; }<br />
            　　}<br />
            　　因此，你可以指定容器如何得到这个服务，并且在运行时通过配置文件中XML元素的连接关系把它提供给POJO。下面的例子显示了连接一个数据源到一个Hibernate session 工厂、session 工厂到Hibernate模板对象、模板对象最后到应用程序POJO类，整个过程的XML配置。<br />
            　　Spring 代码复杂性的部分原因是，我们需要手工的去注射Hibernate相关类，然而，EJB 3.0 实体管理器被服务器自动管理和配置。但是，这使我们返回到了这样的讨论：Spring 不象EJB 3.0 一样，它不同服务紧密整合在一起。<br />
            &lt;bean id="dataSource" <br />
            class="org.springframework.jndi.JndiObjectFactoryBean"&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;property name="jndiname"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;java:comp/env/jdbc/MyDataSource&lt;/value&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &lt;/bean&gt;<br />
            &lt;bean id="sessionFactory" <br />
            class="org.springframework.orm.hibernate.LocalSessionFactoryBean"&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;property name="dataSource"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="dataSource"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &lt;/bean&gt;<br />
            &lt;bean id="hibernateTemplate" <br />
            class="org.springframework.orm.hibernate.HibernateTemplate"&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="sessionFactory"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/property&gt;&nbsp;&nbsp;&nbsp; <br />
            &lt;/bean&gt;<br />
            &lt;bean id="fooDao" class="FooDao"&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;property name="hibernateTemplate"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="hibernateTemplate"/&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
            &lt;/bean&gt;<br />
            &lt;!-- The hibernateTemplate can be injected into more DAO objects --&gt;<br />
            　　尽管Spring中基于XML的注射依赖比较复杂，但是它非常强大。你可以注射任何POJO到另外的POJO中，包括程序中自定义的。<br />
            　　如果你确实想在EJB 3.0应用中使用Spring的注射依赖功能，你可以将一个Spring Bean工厂类通过JNDI注射到一个EJB中。在某些EJB 3.0 应用服务器中，厂商可能会定义一些非标准的API用来注射任意的POJO类。一个很好的例子是JBoss MicroContainer，它处理了AOP依赖性，因此它是甚至比Spring 更加通用。<br />
            　　<br />
            结论<br />
            　　尽管Spring 和EJB 3.0的目标都是提供企业服务，使得POJO可以松耦合，但是它们实现的方式非常不同。在两个框架中注射依赖模式都有大量的应用。<br />
            　　通过EJB 3.0的标准方式、大量应用的注解、还有同应用服务器紧密整合性，这些提供了更高的厂商无关性和开发人员工作效率。Spring的以XML为中心的配置文件和注射依赖的连贯使用，允许开发人员去构造更加灵活的应用系统，并且可以同时与多个应用服务提供者同时工作。</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/dunkbird/aggbug/306975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dunkbird/" target="_blank">大鸟</a> 2009-12-23 10:02 <a href="http://www.blogjava.net/dunkbird/articles/306975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>