1.1 Spring概览

Rod Johnson是Spring的缔造者,被称为Spring之父。他在2002年编著的“Expert one-on-one J2EE Design and Development”一书中,对JavaEE系统框架臃肿、低效、脱离现实的种种现状提出了质疑,并积极寻求探索革新之道。以此书为指导思想,他编写了interface21框架,这是一个力图冲破JavaEE传统开发困境,从实际需求出发,着眼于轻便、灵巧,易于开发、测试和部署的轻量级开发框架。

Spring框架以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日发布了1.0正式版。同年,Rod Johnson又推出了一部堪称经典的力作“Expert one-on-one J2EE Development without EJB”,该书在Java世界掀起了轩然大波,不断改变着Java开发者程序设计和开发的思维方式。在该书中,Rod Johnson根据自己多年丰富的实践经验,对EJB的各种笨重、臃肿的结构进行了逐一的分析和否定,并分别以简洁实用的方式替换之。从此,Spring框架得到快速发展。

Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。并且,Spring的用途不仅限于服务器端的开发,从简单性、可测试性和松耦合性的角度而言,任何Java应用都可以从Spring中受益。

Spring是全面的框架,同时也是模块化的框架。Spring有分层的体系结构,这意味着我们能选择使用它孤立的任何部分,它的内在架构仍然是稳定的。例如,我们可能选择仅仅使用Spring来简化JDBC的使用,或用来管理所有的业务对象。图1.1展示了Spring的全部模块。

下面对图1.1中出现的模块做简要介绍。

● CoreContainer(核心容器)

CoreContainer即IOC容器,由Beans、Core、Context和Expression Language模块组成。Beans和Core模块提供了框架的基础,包含依赖注入和控制反转功能。这两个模块的焦点是BeanFactory接口,它是对工厂模式的经典实现。使用它,不必再通过编程方式实现单例模式,同时解除了由对象间依赖带来的耦合。

Context(上下文)模块建立在Core和Beans模块提供的坚实基础上,它提供了一种类似JNDI注册表的方式来访问容器内的对象——通过名字查找对象。Context从Beans模块继承了基本功能并增加了对国际化、事件传播、资源加载的支持。该模块也支持JavaEE功能,如EJB、JMX和基本的远程访问。ApplicationContext接口是Context模块的焦点(它扩展了BeanFactory接口)。

图1.1 Spring框架概览

Expression Language模块提供了一个强大的表达式语言,用于查询和操作运行时的对象图。它是JSP 2.1规范中EL表达式的一个扩展,它支持设置和获取对象属性值、方法调用、数组操作、集合操作、算术运算、从IOC容器提取对象等功能,它也支持集合上的投影和选择功能。

● DataAccess/Integration(数据访问/集成)

数据访问层由JDBC、ORM、OXM、JMS和Transactions模块组成。

JDBC模块提供了JDBC的抽象层,它可消除冗长的JDBC编码。JDBC封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅对实现了特定接口的类适用,而且对所有的POJOs都适用。

ORM模块提供了常用的“对象/关系”映射框架的集成,包括JPA、JDO、Hibernate和iBatis。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前面提到的简单声明性事务管理。

OXM模块提供了一个抽象层,用于支持对象和XML映射的实现,这些实现有JAXB、Castor、XMLBeans、JiBX和XStream。

JMS(Java Messaging Service,Java消息服务)模块包含生产和消费异步消息的功能。

Transactions模块支持编程式的或声明式的事务管理,进行管理的类可以是实现了特定接口的类,也可以是普通Java类。

● Web

Web层包含Web、Servlet、Struts和Portlet模块。

Web模块提供基本的面向Web的集成功能,例如文件上传、使用Servlet监听器初始化IOC容器和针对Web的应用上下文,它同时包含了Spring的远程访问支持部分。

Servlet模块包含Spring的MVC实现。Spring MVC分离了领域模型代码、表单数据,并将它们和Spring的其他特性集成在了一起。

Struts模块包含了集成Struts 1.x所需的支持类。从Spring 3.0开始,这些类将被弃用,建议大家转向Struts 2.0,并使用Struts 2.0集成Spring的方案(具体来说是用插件)。

Portlet模块提供了用于Portlet环境的MVC实现。

● AOP、Aspects、Instrumentation

AOP模块提供了符合AOP Alliance规范的面向切面编程(Aspect-Oriented Programming)实现,让我们可以定义方法拦截器(MethodInterceptor)和切入点(Pintcut),从而将通用功能性代码与业务逻辑完全分离。

Aspects模块提供了与AspectJ(专门的AOP框架)的集成。

Instrumentation模块提供了标准的仪表化支持和用于具体应用服务器的ClassLoader的实现。

● Test

Test模块用于支持Spring与JUnit或TestNG集成,从而方便快捷地对系统功能进行测试。

通过对Spring框架各模块的介绍,我们了解到Spring提供的内容几乎涵盖了Java开发的方方面面。本书将侧重介绍它的两个核心——IOC和AOP,同时使用具体案例示范Spring如何与Struts2和Hibernate协同工作,完成Web应用开发的MVC结构及持久层实现。