Chapter 26. 演示案例

26.1. 介绍

Spring Framework发行包中还带有几个所谓的案例。每个案例都提供了可运行的范例, 每次演示某一个Spring 2.0的新特性。这么做的目的是让你可以使用其中的代码来进行体验, 而无需自己动手创建试用Spring 2.0新特性的小项目。这些演示案例的范围是有限的;域模型(如果有的话)可能只有一或两个类, 一般企业考虑的诸如安全、错误检查和事务完整性之类的东西都被忽略了。

26.2. 使用动态语言实现的Spring MVC控制器

这个小应用案例使用Spring 2.0引入的动态语言支持来实现Spring MVC控制器。

这个Web应用程序简单,因为其目的只是把基本的动态语言支持运用于Spring MVC中,没别的东西了。

应用程序中有一个Groovy文件。名字是'FortuneController.groovy',放在'war/WEB-INF/groovy'文件夹中。 'war/WEB-INF/fortune-servlet.xml'这个Spring MVC配置文件的 'fortune' bean会引用该Groovy脚本文件。

通过<lang:groovy/>元素的'refresh-check-delay'属性,'fortune' bean被设置为refreshable bean。(校对时注意去掉本括号,动态语言章节中refreshable未翻译,故此处对该句做了相应调整。) 该属性设置为'3000'也就是说对'FortuneController.groovy'会在3秒钟延时后生效。

如果是把应用程序部署到Tomcat(打个比方),那你可以进入'/WEB-INF/groovy'文件夹,直接编辑'FortuneController.groovy'文件。 任何改变都会自动生效,'fortune' bean将被重新配置……完全无需停止、重新部署并重启应用程序。亲自尝试一下吧…… 毫无疑问'FortuneController.groovy'文件里并没有什么很复杂的逻辑(这是件好事,因为Spring MVC中的控制器本来就该尽可能地简单一些)。

你可以试着返回一个默认的Fortune而不是将它代理给注入的FortuneService,或者也可以返回一个不同的逻辑视图名, 如果想更进一步的话,还可以自己创建一个实现了FortuneService接口的Groovy实现,并将它插入Web应用程序中。 也许你自定义的Groovy FortuneService可以访问Web服务来获得某些Fortune,亦或者应用一些不同的随机逻辑来返回Fortune,随便怎么样都行。 关键是在做这些变更时无需重新部署应用程序。这在做快速原型开发时简直太棒了。

26.2.1. 构建与部署

samples/showcases/dynamvc目录包含了web-app的源代码。部署时需要用Apache Ant进行构建。 唯一的要求是JDK >=1.4(Groovy要求JDK至少要是1.4的)Ant >=1.5。

在该目录中运行“build.bat”,带上某个目标(例如"build.bat build","build.bat warfile")。 请注意,用这种方式启动Ant你需要在classpath中存在一个XML解析器(例如放在"%JAVA_HOME%/jre/lib/ext"中;包含在JDK 1.4中)。 可以用“warfile.bat”来生成WAR文件。WAR文件会被建在"dist"目录中。

26.3. 使用SimpleJdbcTemplate@Repository实现DAO

这个小案例通过Spring中的一些Java5特性,使用Hibernate和JDBC实现了DAO。这个项目非常简单, 因为其目的只是演示SimpleJdbcTemplate@Repository注解的基本用法及几个其他DAO相关的特性, 没其他内容了。

26.3.1. 域对象

范例中的域对象是车的部件。有两个类:PartCarModel。 使用CarPartsInventory可以查询部件,更新某些部件的库存以及添加新部件。

26.3.2. Data Access Object

有3个基于CarPartsInventory接口的DAO实现,采用了不同的风格。 两个使用Hibernate,另一个用JDBC。JdbcCarPartsInventoryImpl用了JDBC和SimpleJdbcTemplate。 如果仔细看这个DAO,你将发现SimpleJdbcTemplate使用的Java5特性大大简化了你的DAO代码。

TemplateHibernateCarPartsInventoryImpl使用HibernateTemplate来查询Part并更新库存。 如果你已经习惯了使用Spring和Hibernate进行开发,那这里就没有什么特别的东西了。 PlainHibernateCarPartsInventoryImpl并没有使用HibernateTemplate。 它用了Hibernate3 API查询会话和数据库来获取部件。当然,Hibernate3 API并不会抛出Spring DataAccessExceptions, 这也是最初使用HibernateTemplate的原因之一。Spring 2.0添加了一个注解,让你仍旧可以获得相同的行为。 @Repository注解(如果仔细看PlainHibernateCarPartsInventoryImpl,你会发现上面有这个注解) 会结合PersistenceExceptionTranslatorPostProcessor 自动将Hibernate异常转换为Spring DataAccessExceptions

26.3.3. 构建

samples/showcases/java5-dao目录包含了项目的源代码。 项目只包含单元测试,你可以脱离源代码来看这些单元测试。要构建并运行这些单元测试,需要使用Apache Ant (或在你喜欢的IDE中运行范例)。在Java5 VM中运行ant tests(项目中使用了注解和泛型)。