• 编程经典技术:Spring的巧妙之处
  • 【时间】2012-01-16    【来源】湖北致信信息技术有限公司
  • 作者注:在《Better, Faster, Lighter Java》一书第八章的这份节录中,我们将看到一个使用Spring框架的企业web应用程序例子。尽管Hibernate提供了单个的服务,Spring框架却提供了一种高效地构建和汇编Java应用程序的方法,以及多种服务的抽象。尽管Spring支持多种服务,但是它最受关注也是最出色的特性是杰出的分层和封装。与EJB一样,Spring的中心组件是一个容器;而且Spring框架也同样提供对核心J2EE服务的访问。但是这就是它们仅有的相似之处了。下面是一个比喻。

      我喜欢皮划艇运动,也花了很多时间来教授皮划艇技巧。我的一个专长就是教授学生如何在浪花中翻转弄翻了的皮划艇。一天,我向一位四肢发达的大个子和一位玲珑瘦小、体重只有97磅的女士传授该技巧。当我在陆地上从头到尾仔细地讲述这项技巧的时候,大个子直勾勾的盯着远方,不感兴趣。而那位女士注意力集中,而且希望反复练习这项基础技巧。在半个小时之内,她就出色地完成了第一次翻转,而他只是上下摇摆,在平静的水面上拍打出细小的白色泡沫。直到第三个学时,他才完成这个动作。在以后的几个学时中,她依靠技巧快速提高,而他却单凭力量在水中挣扎。到了实践的时候,她翻转了皮划艇,而他却在游泳。程序员们,请记住:解决问题的最佳方式是依靠简单性和技巧,而不是蛮力。

      Pet Store:一个反例

      Pet Store J2EE应用程序是一个很糟糕的编程例子。它误导成千上万名J2EE开发人员构建出设计糟糕、性能低下的代码。它还是一个基准的争论焦点。Middleware Company致力于制订比较J2EE和微软的。NET平台的基准。他们选择Pet Store的J2EE版本作为基准的基础。尽管他们很努力地调优,J2EE版本还是惨败给Microsoft .NET版本,因此导致J2EE设计备受批评。我不想针对这次惨败谴责什么。我有不同的看法。我坚持认为:利用J2EE(尤其是EJB)很难开发出整洁、高性能的代码。另一方面,Pet Store基准本身就会导致更大的问题。

      基准纷争过后,很多人借助于更平易且更简单的技术来实现Pet Store.其中一种最强大且最简单的实现方法是Clinton Begin所使用的,他利用一个称为iBatis的DAO框架来代替全部的实体bean.Rod Johnson的团队将该应用程序转化为Spring,并且现在已经与Spring框架一起发布。以下是相关的一些细节:

      Spring jPetStore应用程序包含在M4或更高版本的Spring中。
      它是一种具有JDBC DAO层的数据驱动的应用程序。
      它提供了Strut的替代前端以及Spring MVC框架。
      它提供了两种不同的模型。最简单的模型使用单一数据库和简单JDBC事务。另一种模型可以跨多个数据库使用JTA事务管理。

      在下面的部分中,我将演示具有MVC web前端和单个数据库中的简单事务的应用程序版本。我将重点讨论域模型、单数据库DAO层、单一事务以及Spring MVC前端。Spring网站上提供了大量的资源,可供希望深入研究的开发人员使用。

      配置文件

      了解Spring应用程序应当从配置文件开始,它显示了主要的bean以及应用程序如何将它们组合在一起。Spring配置文件在应用程序上下文中定义bean.将上下文看作是收集应用程序指定资源的一种便利方式。

      很多J2EE应用程序借助单元素来了解诸如连接之类的应用程序资源。这种用途的单元素与很多Java开发人员经常使用的全局变量差别不大。J2EE中的替代方案是一种称为JNDI的目录服务,但是对于许多常见用例来说它就是杀鸡的牛刀了。而Spring使用一种应用程序上下文。最初,需要在一个简单的XML文件中指定应用程序上下文,尽管也可以通过扩展Spring来接受其它类型的配置文件。以下是应用程序上下文中可能会包含的内容:

      数据源

      管理连接的Java类,通常在一个池中。

      DAO层

      如果应用程序使用了数据库,那么很可能需要隔离对DAO层数据库的访问。可以通过应用程序上下文来访问该层。

      持久性管理器

      每个持久性框架都有一个应用程序用来访问其特性的对象或工厂。对于Hibernate来说,它就是会话和会话工厂。而对于JDO来说,它就是持久性管理器工厂和持久性管理器。

      事务策略

      可以显式地声明希望在事务中使用的方法以及用于实施该策略的事务管理器。

      事务管理器

      J2EE中有很多不同的事务管理策略。对于单一数据库的应用程序,Spring允许使用数据库的事务管理。对于多个数据库或事务源,Spring允许使用JTA.可以将事务管理器保存在应用程序上下文中。

      验证逻辑

      Spring框架使用一种与Strut类似的验证框架。Spring允许像配置其他业务组件那样配置验证逻辑。

      视图和控制器

      Spring框架允许为视图指定控制器,并帮助用户通过控制器来配置导航路径。

      jPetStore应用程序使用包含一个数据源、DAO层和一种事务逻辑的Spring应用程序上下文。用户定义XML文档中上下文的内容,该XML文档列出了一系列bean.每一个XML配置文件都包含一个题头,其后是一系列组件和一个脚注。  以上是构成应用程序上下文的bean。它们代表应用程序中的顶级bean。(它们可以创建不出现在配置文件中的其他对象或bean。)在本例中,我们会创建两个bean:MyFirstBean和MySecondBean。然后,通过指定MySecondBean作为字段myField的值,将它们关联起来。当Spring启动的时候,它会创建两种对象,并设置myField的值。当在应用程序上下文中需要它们的时候,可以根据名称来访问这两种对象。

      我们来看一个更具体的实例。jPetStore应用程序为业务逻辑、数据层和用户界面提供了三种配置文件,每种Spring配置文件各自描述三者之一,如图8-2所示。


    图8-2 jPetStore应用程序提供了分别与三个不同的层相匹配的Spring应用程序上下文