如果您是一名典型的开发人员,那您必然乐意得到一个可解决数据访问问题的解决方案,也会欢迎任何能够简化配置的工具。如果不是有人提出了 Spring,则对 Web 应用程序做一个总体介绍将非常困难,对于这些特定的问题更是如此。但是,天哪,我们真的需要另外一种 Web 应用程序框架吗?在我决定撰写一期 Geronimo 叛逆者文章,来探讨 Apache Geronimo 和 Spring 的交叉时,我就知道,这正是搞清所有关于 Spring 框架的传闻的大好时机。Jeff Genender 为我解答了很多难题,我完成了这个任务。
控制反转使配置更轻松
通过求助于 Jeff Genender、Geronimo committer 和周围的能人,我开始了寻求有关 Spring 框架的所有问题的答案的旅程。我替那些不熟悉 Spring 的人提出了这样的问题:Spring 究竟为何物?
稍做调查后,我了解到,Spring 是一种 Web 应用程序 API,它包含了模型-视图-控制器(Model-View-Controller,MVC)模式的实现,供那些不喜欢 Struts 的人使用。但是到底是什么本事使其声名显赫?哪种至关重要的特性为此框架提供了关键部分?
“Spring 是一个 IoC 容器”,Jeff 解释道,“那代表控制反转(Inversion of Control),使您能够注入在 XML 文件中声明的依赖项。”
IoC 对我来说是一个新术语,因此 Jeff 解释说,创建应用程序时通常会拥有依赖另一个对象的对象。例如,您拥有一个表示三明治制造机的对象,该对象引用了另一个对象:三明治装填机。因此您可能拥有下面这样的代码(参见清单 1)。
清单1:一个样例类
|
当然,实际的 SandwichFiller 将取决于您想要制造何种类型的三明治。因此百吉饼商店和大型三明治商店的 SandwichFiller 类实现可能会有所不同。实例化 SandwichMaker 类时,您当然可通过调用 setSandwichFiller() 方法提供 SandwichFiller 的适当实现。但随后需要更改代码,在新位置安装 SandwichMaker。Spring 让您能够创建包含这些依赖项定义的应用程序上下文。(因此有时将此称作依赖项注入。)
文件可能形入清单 2 所示。
清单2:ApplicationContext.xml 文件
|
好,让我们更仔细地观察它一下,从底部开始。我们已告知环境,实例化 com.sandwich.SandwichMaker 类时,sandwichFiller 属性应由标识为 ccandjFiller 的 bean 来填充。该 bean 是一个 com.sandwiches.CreamCheesAndJellyFiller,有着自己的属性。它的 sandwichType 为 bagel,后者将 breadPreference 设置为 bagel(而不是 rye 或 bialy),并且其宽度为 5 英寸。另外,我们希望奶酪比葡萄果冻稍微多一点。
现在看来,这里有着太多的自定义工作;如果您想将那些项都编写到应用程序中去,则要在程序更改时进行大量的重编译工作,或在选项中进行大量的构建工作以做出所有那些选择。Spring 通过只更改 XML 文件而使我们能更轻松地做出更改。在此我选择了一个比较简单的示例,但可以想像一下,您正在配置数据源,这个 IoC 立即变得至关重要。
数据库的优点
提到数据源,Jeff 解释说这是另一个领域,其中 “Spring 拥有扩展了很多 J2EE(和非 J2EE)组件的优秀 API”,使开发人员更加轻松。
“在 Spring 中创建数据访问对象相对较为简单”,他解释说。“使用 JDBC(或其他框架,如 Hibernate)扩展几个 Spring 类,实现 DAO,然后在 applicationContext.xml 文件中做出声明。此后可通过声明的方式将这些 DAO 注入业务对象,方法是为 DAO 设定一个 setter 方法并在 Spring XML 文件中声明业务对象。”
从交谈中,我学到了如此之多的 IoC 相关知识。但不止于此:“这样做,您就可以摆脱捕获 SQLExceptions 的要求,并使【对数据库的】测试与交换声明一样简单。”
我明白后半部分;数据库是一个可在 applicationContext.xml 文件中轻松设置的属性。但它是如何使您摆脱捕获 SQLExceptions 的要求的呢?
“Spring 将 SQLExceptions 等转换为未检查异常,从而隐藏了 JDBC SQL 问题。这随后又清除了错误,从而使问题一目了然。这是处理数据库异常的一种更好的方法。”
大致说来,创建 JDBC 应用程序时,如果出现问题,您将得到 SQLException。遗憾的是,该 SQLException 往往不会包含实际查找出问题所在而必需的全部信息,因为实际信息被编码为特定于供应商的错误码,您必须对其进行跟踪。当然,由于此处设计思想的一部分是可轻松地 更改数据源,因此将智能编码到应用程序中是不可接受的。但是,通过将数据库交互包装到 Spring 类中,如 JdbcTemplate,可确保将所有错误表达为 DataAccessException,或更重要地,表达为 DataAccessException 的十余个子类之一,包括 DataAccessResourceFailureException、DataIntegrityViolationException 和 OptimisticLockingFailureException 等。这样您就可以更灵活地编写应用程序。
共2页: 1 [2] 下一页 |