一、 技术概览
轻量级的企业应用开发越来越受到广大Java应用开发者的追捧,而Spring框架又是轻量级容器的杰出代表。由于Spring的使用日渐广泛,因此已有许多应用服务器(WAS)的应用采用了Spring框架。本书先介绍Spring的依赖注入、面向切面编程、Spring抽象JDBC框架,然后介绍三大框架的整合。
Spring框架的核心思想我们可以用两个字来描述,那就是“解耦”。应用程序的各个部分之间(包括代码内部和代码与平台之间)尽量形成一种松耦合的结构,使得应用程序有更多的灵活性。应用内部的解耦主要通过一种称为控制反转(IOC)的技术来实现。控制反转的基本思想就是本来由应用程序本身来主动控制的调用等逻辑转变成由外部配置文件来被动控制。由于控制反转的概念相对比较广泛,很多应用服务器实际上也实现了不同程度的控制反转技术,只是这些应用服务器对应用程序的侵入性太强。因此Martin Fowler专门写了一篇文章讨论控制反转这个概念,并提出一个描述更为准确的概念,叫依赖注入(Dependency Injection)。
Spring框架中的各个部分都充分使用了这种依赖注入的技术实现,从而给应用以最大的灵活度。实际上,这种依赖注入的参数化应用控制并不是Spring的首创,比如IBM的多渠道应用整合平台(Branch Transformation Toolkit,BTT)很早就采用了这种外部参数化控制的技术。BTT中的“对象工厂”与Spring框架中的BeanFactory也有着异曲同工之妙。
Spring框架另外一个比较重要的技术是它对于面向切面的编程(AOP)的支持。随着应用复杂度的逐渐上升和对应用灵活性要求的提高,IT逻辑和业务逻辑尽量分离的呼声也越来越高。AOP技术作为实现这种分离的一种比较好的途径而越来越受到大家的重视。Spring提供的是一种动态AOP实现,也即通过代理模式动态地在目标对象的方法前后插入相应的处理代码。应用程序与底层应用服务器平台的解耦也可以借助AOP技术来实现。Spring内置的AOP支持是一种锦上添花的功能。它使得一些本来必须由容器支持的功能,比如事务控制可以脱离开容器运行,从而达到“瘦身”的目的。这也是为什么Spring框架常被人成为轻量级容器的一个原因。
JDBC基于SQL,不要求我们掌握其他框架的查询语言,简单易学,因此学习成本低。另外,在使用 JDBC 时,可以更细致地调整数据访问的性能。JDBC 还允许我们利用数据库的特有功能,而其他框架可能不鼓励甚至禁止使用它们。 但是JDBC并不完美,无论是执行查询,更新,插入还是删除操作, JDBC都要求我们正确地管理连接和语句,还要处理可能抛出的SQLException,及时的释放资源。这显然造成了大量的代码重复。这似乎印证了 Pareto 法则:只有 20% 的代码是查询操作所必需的,而80%代码是样板代码。Spring抽象JDBC框架基于模板设计模式,将上述必须都又和核心业务无关的样板代码封装到模板方法中,以简化开发,让编程人员可以将精力集中在核心业务之上。
Spring框架可以与许多已有的框架技术结合使用。J2EE技术应用的一个重要特点是相关的开源社区非常活跃。Web应用的不同层次都有非常多优秀的开源框架存在。比如Web层的Struts,ORM映射层的Hibernate等。Spring框架并不重新发明轮子,它的出现不是为了替代这些已有的框架。相反,Spring框架在设计上可以独立构建应用或者结合已有的框架一起构建应用。另外一个值得指出的地方是Spring框架的几大模块之间相互耦合度很小,因此Spring框架的使用可以根据实际需要选其部分模块循序渐进的使用,而非必须统统照搬。
参考博客:http://blog.csdn.net/zhangchen124/article/details/78005056
本章简介
Spring是用于简化企业应用程序开发过程的开源框架,属于轻量级的控制反向 (IOC,即 Inversion of control)和面向切面编程 (AOP,即 Aspect Oriented Programming)的容器框架。本章以 Spring的起源及背景为起点,介绍Spring的工作原理。然后以组装计算机为贯穿案例介绍Spring Bean的封装机制、Spring对Bean的管理,分别使用设值注入、构造注入、自动注入等方式组装Bean。最后通过一个示例介绍集合属性的使用。
Spring 是用于简化企业应用程序开发过程的开源框架,属于轻量级的控制反转 (IOC)和面向切面编程 (AOP,即 Aspect Oriented Programming)的容器框架,解决了J2EE开发中许多常见的问题。我们需要了解一下Spring中的一些名词:
(1)轻量级:以所占大小及系统开销分析,Spring属于轻量级。整个Spring框架可以打包为 1M左右的JAR包,且系统开销较小。同时,Spring为非侵入式,若系统基于Spring开发,其所含的对象一般不依赖于Spring的类。
(2)IOC: IOC使对象被动接受依赖类,而并非主动获取。也就是说,告诉 Spring“你”是什么,“你”需要什么对象,然后Spring会在系统运行到适当的时候,把“你”要的对象主动给“你”,同时也把“你”交给其他需要“你”的对象。所有的类的创建、销毁都由Spring来控制,控制对象生存周期的不再是引用它的对象,而是 Spring。对于某个具体的对象而言,使用 Spring 之前是它控制其他对象,现在是所有对象都被 Spring 控制,所以叫控制反转。在系统运行中,动态的向某个对象提供它所需要的其他对象,这一点是通过DI(依赖注入)实现的。
(3)AOP:面向切面编程(也叫面向方面编程),关注系统的横向切面。通俗点说就是把代码“切开”,然后在需要的位置上动态加入公共代码。比如日志或者事务支持。
(4)容器:Spring 是一个包含且管理系统对象生命周期和配置的容器,在使用 Spring 应用开发的时候,几乎所有的 JavaBean 对象都需要 Spring 来“盛放”。Spring 容器的作用是管理对象。
(5)Spring框架:Spring能够通过简单的组件组合为复杂的系统。Spring框架为分层架构,由7个定义良好的模块组成,各模块构建于核心容器之上,核心容器定义了创建、配置及管理Bean的方式
(1)Spring Core:核心容器,用于提供 Spring框架的基本功能,其主要组件为 BeanFactory,是工厂模式的实现。BeanFactory使用反向控制(IOC)模式将应用程序的配置及依赖性规范与实际应用程序代码分开。
(2)Spring Context:核心模块的BeanFactory使Spring成为容器,上下文 (Context)模块使其成为框架。此模块扩展了BeanFactory的概念,增加了对国际化(I18N,即Internationalization)消息、事件的传播以及验证的支持;同时,此模块提供诸多企业服务,如电子邮件、JNDI访问、EJB集成、远程以及时序调度(Scheduling)服务,支持对模版框架 (如Velocity、FreeMarker)的集成。
(3)Spring AOP:通过配置管理特性,Spring AOP模块将面向切面编程功能集成至框架中,使Spring框架管理的任何对象均支持AOP。Spring AOP模块向基于 Spring的应用程序中的对象提供事务管理服务。此模块无需依赖于EJB组件,可以使用 Spring AOP将声明式事务管理集成至应用程序中。
(4)Spring DAO:JDBC DAO抽象层提供了意义重大的异常层次结构,简化了错误处理过程并极大地减少了需要编写的异常代码 (如打开或关闭连接),运用此结构可以管理异常、处理不同数据库供应商抛出的错误消息。Spring DAO的面向JDBC异常遵从通用的 DAO异常层次结构。
(5)Spring ORM:Spring框架中插入了若干ORM框架,提供ORM的对象关系工具,包括JDO、Hibernate以及iBatis SQL Map,都遵从Spring的通用事务及DAO异常层次结构。
(6)Spring Web:Web上下文模块建立在应用程序上下文模块之上,向基于Web 的应用程序提
供上下文,因而Spring框架支持与Struts集成。同时,Web模块简化了请求的处理过程以及将请求参数绑定至域对象的工作。
(7)Spring MVC:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC框架变为高度可配置,它容纳了大量视图技术,包括JSP、Velocity、Tiles、iText及POI等。