服务集成的灵活性
由于Spring中的服务集成代码是作为编程接口的一部分暴露的,应用程序开发者可以根据需要灵活地集成服务。这个特性允许你集成自己的"轻量级"应用程序服务器。Spring最普遍的使用方式是把Tomcat和Hibernate"粘合"在一起来提供简单的 数据库驱动web应用程序。在这种情况下,Spring自身提供事务服务,Hibernate提供持续(persistence)服务--这种组织方式在Spring中建立了一个微型应用程序服务器。
EJB 3.0应用程序服务器没有赋予你挑选服务的灵活性。在大多数情况中,你得到一组事先包装好的特性,而你只需要其中的一部分。但是,如果应用程序服务器由模式化的内部设计主导(类似JBoss),那么你就可能把它分开,去掉一些不必要的特性。在任何情况下,定制成熟的应用程序服务器都不是一个简单的事情。
当然,如果应用程序的范围超越了单节点,那么你可能需要捆绑来自普通应用程序服务器的服务(例如资源缓冲池、消息队列和群集)。在总体的资源消耗方面,Spring解决方案与任何EJB 3.0解决方案一样,都是"重量级"的。
在Spring中,灵活的服务集成使得我们更容易把仿制(mock)对象(而不是实际的服务对象)捆绑到应用程序,用于在容器外部进行单元测试。在EJB 3.0应用程序中,大多数组件都是简单的POJO,我们可以很容易地在容器外部测试这些它们。但是对于测试那些涉及到容器服务的对象(例如持续EntityManager),我们推荐在容器内测试,因为比起仿制对象的方法,它们更简单、更牢固、更精确。 XML与注释的比较
Spring和EJB 3.0关于XML或注释的选择是依赖于这两个框架 组件后面的架构的:由于注释只能保存相当少的配置信息,只有预先集成的框架组件(类似在框架组件中已经完成了大多数预备工作)可以广泛地把注释作为配置选项。我们已经讨论过了,EJB 3.0符合这种需求,而Spring作为一个通用的DI框架组件,不符合这个需求。
当然,EJB 3.0和Spring都在学习对方的最佳特性,它们都在某个程度上支持XML和注释。例如,在EJB 3.0中XML配置文件是一个可选的重载机制,可以用于改变注释的默认行为。注释也可以用于配置某 pring服务。
认识XML和注释之间的区别的最好途径是通过示例。在下一部分,我们会看到Spring和EJB 3.0是如何为应用程序提供关键服务的。
宣告式服务(Declarative Services)
Spring和EJB 3.0都把运行时服务(例如事务、安全性、日志记录、消息和定制服务)捆绑到应用程序上。由于这些服务都没有直接地与应用程序的业务逻辑相关联,因此它们不由应用程序自身