第十四章Spring应用详解•在本章的内容中,首先介绍Spring核心技术控制反转和面向切面编程的基本知识,在Web方面,详细介绍了如何使用Spring实现MVC,然后对Spring中的数据库操作进行简单的介绍,在本章的最后,展示了如何在Spring中进行事务处理,通过本章内容的学习,读者可以从整体上了解Spring的基本知识,通过具体示例程序的学习,读者可以逐步学习编写自己的Spring程序。14.1Spring简介•Spring是一个开源框架,是为简化企业级应用系统开发而推出的,通过使用Spring,用户可以用简单的JavaBean实现以前只能用EJB才能完成的任务,虽然Spring是为企业级应用推出的,但是所有的Java系统开发都可以使用Spring,包括桌面应用程序和企业级的Web应用,在本节中,将对Spring做一个大体的介绍,关于Spring的核心技术和使用方法在后面的章节中进行介绍。14.1.1Spring简介•Spring是一个轻量级的框架,Spring所耗费的系统资源开支比较少,而且Spring是非侵入失的,在一般情况下,引入Spring的系统中,具体的对象并不依赖于Spring的API。在Spring中,提供了对反转控制(IoC)和面向切面编程(AOP)的良好支持,Spring是由以下几个模块组成的,这些模块提供了开发企业级应用所需要的基本功能,可以在自己的程序中选择使用需要的模块。14.1.2Spring开发环境的简单配置•Spring开发环境的配置方法比较简单,可以下载Spring的开发包,把下载下来的压缩文件解压到硬盘中,然后把Spring.jar和其他相关类库加入项目即可。另外,还可以在Eclipse(已经安装MyEclipse插件)中配置Spring的开发环境,在Eclipse中新建一个项目,JavaProject或者WebProject均可,这个可以根据需要而定,新建工程完成以后,在Eclipse的菜单栏中选择“MyEclipse”|“Capabilities”|“AddSpringCapabilities”就可以进入添加Spring模块的界面,在这个界面中选择所需的Spring模块的类库即可。14.2Spring核心理论控制反转介绍•Spring框架本身提供了很多的功能,这些功能之所以能组合成为一个整体,就是因为使用了控制反转技术,控制反转是Spring的核心技术之一,在本小节中,将介绍控制反转的基本知识,同时详细展示了如何在Spring中实现控制反转。14.2.1控制反转基础知识•在学习Spring的时候,往往会遇到控制反转(InversionofControl)、依赖注入(DependencyInjection)这些新名词,IoC也就是由容器控制程序之间的关系,而不是在程序中直接使用代码控制,控制权由程序代码转移到外部容器,控制权的转移就是所谓的反转,这就是控制反转(IoC)的本质含义。由于程序组件之间的依赖关系是有容器控制的,在程序运行期间,是由容器动态将依赖关系注入到组件之中,这就是依赖注入的本质含义。依赖注入在本质上也就是控制反转的另一种解释。14.2.2控制反转简单示例•在介绍Spring控制反转的具体内容之前,先展示一个具体的示例程序,通过这个示例程序,读者可以提前体验使用控制反转带来的便捷之处。在下面这个示例程序中,通过控制反转实现了问候用户的基本功能。(具体内容请参照书。)14.2.3Spring中注入依赖的方法•Spring中对象之间的依赖是由容器控制的,在程序运行期间,容器会根据配置文件的内容把对象之间的依赖关系注入到组件中,从而实现对象之间的协同工作。在Spring中,注入对象之间依赖关系的方式有以下几种。(具体内容请参照书。)14.2.4Spring中通过赋值方法注入依赖•在接下来的内容中,将简单介绍Spring中注入依赖的几种方法,在上面的简单的Spring依赖注入的示例中,并没有展示复杂的注入特性,仅仅是在程序的运行期间,把SpringIoC这个字符串赋值给Welcome和Bye这两个Bean中的name属性,同时在Welcome和Bye这个两个Bean中还提供了name属性的getter和setter方法,Spring可以调用Bean中的属性设置方法,在程序运行期间,根据配置文件中的内容给Bean的属性赋值。(具体内容请参照书。)14.2.5Spring中通过构造器注入依赖•赋值注入的方法虽然非常方便,但是也有自身的缺点,在赋值注入的方式中,无法确定哪些属性是必需的,哪些属性是可选的,这样就容易造成初始化bean的时候,有的属性可能并没有被正确设置,而在Spring中,提供了构造器注入依赖的方式,这种方式在构造器中强制需要初始化的方法,而且还可以指定初始化参数的顺序,这种方式可以满足一些赋值注入无法实现的需要。(具体内容请参照书。)14.3Spring核心理论面向切面编程介绍•面向切面编程(AspectOrientedProgramming即AOP)是Spring中的另一中核心技术,AOP提供另一种角度来思考程序结构,通过使用AOP可以给面向对象编程提供强大的辅助功能,在Spring框架中,提供了对AOP的支持,Spring的AOP框架允许将分散在系统中的模块集中起来,通过AOP中的切面实现,并通过Spring中强大的切入点机制在程序中随时引入切面,通过使用Spring的AOP框架,就可以给系统中添加强大的服务,例如身份认证、声明式事务管理等服务。14.3.1面向切面编程基础知识•在一般的应用系统中,会通过多个模块实现系统的总体功能,每个模块的主要功能是提供不同的业务逻辑,但是这些模块会需要一些相似的底层功能的支持,例如安全、用户身份认证、事务处理等。如果在各个模块中都通过代码来调用这些底层功能,就会是调用代码分布在系统的各个角落,从而增加了系统的耦合性,给后继的维护升级都带来很大的潜在困难。14.3.2在Spring中创建前置通知•在下面的实例程序中,将展示Spring中创建前置通知的基本方法,下面Customer这个类中,实现了最基本的buy()方法,在这个方法中相控制台打印购买商品的信息。(具体内容请参照书。)14.3.3在Spring中创建后置通知•在上面的示例程序中,展示了Spring中前置通知的使用方法,在下面的实例程序中,将展示在Spring中创建后置通知的基本方法,在这里仍然使用Customer这个bean作为目标对象,在顾客执行购买商品的动作之后,在控制台打印告别信息。(具体内容请参照书。)14.3.4在Spring中创建拦截通知•在上面两个实例程序中,分别展示了Spring中前置通知和后置通知的具体实现方法,在实际的开发过程中,也会有创建拦截通知的需要,也就是在方法执行之前和方法返回之后都能够进行特殊的处理,这在Spring中就是拦截通知。(具体内容请参照书。)14.3.5在Spring中创建异常通知•在上面的示例程序中,展示的都是程序正常运行的时候附加的通知,在Spring中,也提供了异常通知,这种通知会在目标对象抛出异常的时候被调用,下面是在Spring中创建异常通知的具体方法。(具体内容请参照书。)14.3.6使用Spring静态切入点•在上面展示的各种通知中,使用的就是静态切入点把通知应用在目标对象上,但是在上面的示例程序中,在目标对象中,只有一个方法,所以就不用指定把通知应用在哪个方法中,Spring会把通知应用在这个唯一的方法上。14.4Spring实现MVC•虽然在Spring中可以非常方便的与其他MVC框架集成,例如Struts、WebWork等都可以集成在Spring中,而且在Spring中也实现了自身的MVC框架,在Spring的MVC框架中,可以透明地将Web参数绑定到业务对象中,同时在Spring中还可以使用现存的多种视图技术,Spring解决了传统MVC框架中的不足。14.4.1Spring中MVC的实现原理•SpringMVC的核心组件是DispatcherServlet,这个Sevlet是Spring的前端控制器,DispatcherServlet和其他普通的Servlet一样,需要在web.xml中进行配置,下面就是一个DispatcherServlet的基本配置,具体代码如下。(具体内容请参照书。)14.4.2Spring中简单MVC示例•在本节中,将通过一个简单的示例程序,用来展示SpringMVC的基本处理流程,在上面的章节中,介绍了SpringMVC的基本流程,在这里我们先辨析控制器的逻辑,在这个示例程序中,控制器的具体代码如下。(具体内容请参照书。)14.4.3把用户请求映射到控制器•在Spring中还提供了另一种映射处理器,即SimpleUrlHandlerMapping,这个映射处理器的使用也非常简单,例如在下面的配置示例中,有两个控制器bean,分别对应着两个不同的用户请求URL,这就可以使用SimpleUrlHandlerMapping来进行处理,具体的配置过程如下。(具体内容请参照书。)14.4.4在控制器中处理带参数的用户请求•通过上面章节中配置的映射处理器,可以把用户的请求URL映射到控制器中,然后控制器就可以根据用户请求的信息进行相应的处理,在本节中将介绍SpringMVC中处理用户请求参数的具体方法。(具体内容请参照书。)14.4.5在控制器中处理简单的表单•在SpringMVC中,提供了处理表单的处理器,不仅可以处理简单的表单,而且可以提供复杂表单的向导,在下面会展示Spring中处理简单表单的基本方法。(具体内容请参照书。)14.4.6解析视图•在上面的示例程序中可以看出,SpringMVC的控制器在处理结束之后,会把处理的结果用ModelAndView对象的形式返回,这个对象是不能直接展示给用户的,需要通过视图解析器的解析,把这个对象中的信息提取出来以后在展示给用户。上面的示例程序中,仅仅使用jsp模版来展示ModelAndView对象的信息,其实在SpringMVC中提供了很多中视图展示技术,例如JSTL、JSP、Velocity等,这些内容可以参考Springreference,在这里限于篇幅不再赘述。14.5Spring中的数据库操作•数据库操作是Spring独具特色的地方,再Spring的数据库操作中,不用再担心数据库资源释放的问题,Spring中提供了常用的数据库操作模版,用户可以专注书写自己的数据库操作业务代码,而不再过多考虑数据库连接的取得与释放。而且Spring还可以非常方便与其他ORM工具整合,Spring提供了对这些ORM工具良好的支持。14.5.1在Spring中配置数据源•在对数据库进行操作的时候,首先需要取得一个Connection对象,即需要首先取得与数据库的连接,在Spring中,是从DataSource中获取Connection对象的,通过下面的配置文件就完成了对数据源DataSource的配置。14.5.2使用JdbcTemplate进行简单的数据库操作•虽然Spring可以很好的和其他ORM工具整合,但是普通的JDBC操作还是大部分开发人员的首选,所以在Spring中提供很好的JDBC支持,Spring中的JDBC框架承担了资源管理和错误处理的任务,从而使数据库操作的代码非常简洁。在Spring这些功能可以用JdbcTemplate类来完成,我们可以在程序用下面的代码创建一个JdbcTemplate对象。14.5.3使用JdbcTemplate进行Java对象查询操作•在上面的实例程序中,返回的结果都是Java中基本的数据库类型,在Spring中,同样可以返回对象格式的结果,而且在Spring中返回对象比在简单的JDBC重返回对象的操作要简洁很多。在下面的实例程序中,将展示Spring返回基本Java对象的具体方法。(具体内容请参照书。)14.5.4Spring中另一种Java对象查询的实现方法•在Spring中,提供了另外