首页 / 软件开发 / JAVA / 使用Spring框架轻松解决数据访问和配置问题
使用Spring框架轻松解决数据访问和配置问题2011-03-23Nicholas Chase如果您是一名典型的开发人员,那您必然乐意得到一个可解决数据访问问题的解决方案,也会欢迎任何能够简化配置的工具。如果不是有人提出了 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:一个样例类package com sandwiches;
public class SandwichMaker implements FoodMaker {
private SandwichFiller filler;
private String currentSandwich;
public void setSandwichFiller(SandwichFiller filler) {
this.filler = filler;
}
public void setNameOfSandwich(string currentSandwich) {
this.currentSandwich = currentSandwich;
}
public void makeSandwiches() {
//make sandwiches using the SandwichFiller
}
}当然,实际的 SandwichFiller 将取决于您想要制造何种类型的三明治。因此百吉饼商店和大型三明治商店的 SandwichFiller 类实现可能会有所不同。实例化 SandwichMaker 类时,您当然可通过调用 setSandwichFiller() 方法提供 SandwichFiller 的适当实现。但随后需要更改代码,在新位置安装 SandwichMaker。Spring 让您能够创建包含这些依赖项定义的应用程序上下文。(因此有时将此称作依赖项注入。)文件可能形入清单 2 所示。清单2:ApplicationContext.xml 文件<beans>
<bean id="bagel" class="com.sandwiches.BagelShop">
<property name="breadPreference" value="bagel" />
<property name="diameter" value="5" />
</bean>
<bean id="ccandjFiller" class="com.sandwiches.CreamCheeseAndJellyFiller">
<property name="sandwichType" ref="bagel" />
<property name="creamCheesePortion" value="60" />
<property name="jellyPortion" value="40" />
<property name="jellyFlavor" value="grape" />
</bean>
<bean id="sandwichMaker" class="com.sandwich.SandwichMaker">
<property name="sandwichFiller" ref="ccandjFiller" />
<property name="nameOfSandwich" value="Cream Cheese and Jelly" />
</bean>
</beans>好,让我们更仔细地观察它一下,从底部开始。我们已告知环境,实例化 com.sandwich.SandwichMaker 类时,sandwichFiller 属性应由标识为 ccandjFiller 的 bean 来填充。该 bean 是一个 com.sandwiches.CreamCheesAndJellyFiller,有着自己的属性。它的 sandwichType 为 bagel,后者将 breadPreference 设置为 bagel(而不是 rye 或 bialy),并且其宽度为 5 英寸。另外,我们希望奶酪比葡萄果冻稍微多一点。现在看来,这里有着太多的自定义工作;如果您想将那些项都编写到应用程序中去,则要在程序更改时进行大量的重编译工作,或在选项中进行大量的构建工作以做出所有那些选择。Spring 通过只更改 XML 文件而使我们能更轻松地做出更改。在此我选择了一个比较简单的示例,但可以想像一下,您正在配置数据源,这个 IoC 立即变得至关重要。