Spring Framework发行包中还带有几个所谓的案例。每个案例都提供了可运行的范例, 每次演示某一个Spring 2.0的新特性。这么做的目的是让你可以使用其中的代码来进行体验, 而无需自己动手创建试用Spring 2.0新特性的小项目。这些演示案例的范围是有限的;域模型(如果有的话)可能只有一或两个类, 一般企业考虑的诸如安全、错误检查和事务完整性之类的东西都被忽略了。
这个小应用案例使用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,随便怎么样都行。 关键是在做这些变更时无需重新部署应用程序。这在做快速原型开发时简直太棒了。
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"目录中。
这个小案例通过Spring中的一些Java5特性,使用Hibernate和JDBC实现了DAO。这个项目非常简单, 因为其目的只是演示SimpleJdbcTemplate和@Repository注解的基本用法及几个其他DAO相关的特性, 没其他内容了。
有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。