Spring Framework简介
作者关于此主题早期文章
起源
要谈Spring的历史,就要先谈J2EE。J2EE应用程序的广泛实现是在1999年和2000年开始的,它的出现带来了诸如事务管理之类的核心中间层概念的标准化,但是在实践中并没有获得绝对的成功,因为开发效率,开发难度和实际的性能都令人失望。
曾经使用过EJB开发J2EE应用的人,一定知道,在EJB开始的学习和应用非常的艰苦,很多东西都不能一下子就很容易的理解。EJB要严格地实现各种不同类型的接口,类似的或者重复的代码大量存在。而配置也是复杂和单调,同样使用JNDI进行对象查找的代码也是单调而枯燥。虽然有一些开发工作随着xdoclet的出现,而有所缓解,但是学习EJB的高昂代价,和极低的开发效率,极高的资源消耗,都造成了EJB的使用困难。而Spring出现的初衷就是为了解决类似的这些问题。
Spring的一个最大的目的就是使J2EE开发更加容易。同时,Spring之所以与Struts、Hibernate等单层框架不同,是因为Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。可以说Spring是一个提供了更完善开发环境的一个框架,可以为POJO(Plain Old Java Object)对象提供企业级的服务。
Spring的形成,最初来自Rod Jahnson所著的一本很有影响力的书籍《Expert One-on-One J2EE Design and Development》,就是在这本书中第一次出现了Spring的一些核心思想,该书出版于2002年。另外一本书《Expert One-on-One J2EE Development without EJB》,更进一步阐述了在不使用EJB开发J2EE企业级应用的一些设计思想和具体的做法。有时间了可以详细的研读一下。
简介
Spring Framework是一个轻量级的解决方案,也是构建企业级应用程序的潜在一站式解决方案。但是,Spring 是模块化的,开发者可以在项目中只使用其中自己需要的部分,例如,可以在任何 web 框架上使用控制反转(IoC),也可以只使用 Hibernate 集成代码或 JDBC 抽象层。它支持声明式事务管理、通过 RMI 或 web 服务实现远程访问,并可以使用多种方式持久化数据。它提供了功能全面的 MVC 框架 ,也可以透明地集成 AOP 到软件中。
Spring目标
Spring Framework是一个Java平台,为开发Java应用程序提供全面的基础架构支持。Spring处理基础架构,因此您可以专注于您的应用程序。
Spring被设计为非侵入式的,这意味着您的域逻辑代码通常不依赖于框架本身。在集成层(例如数据访问层)中,将存在对数据访问技术和Spring库的一些依赖性。但是,应该很容易将这些依赖项与其余代码库隔离开来。
Spring允许您从“普通旧Java对象”(POJO)构建应用程序,并以非侵入方式将企业服务应用于POJO。此功能适用于Java SE编程模型以及完整和部分Java EE。
作为应用程序开发人员,您可以从Spring平台中受益的示例如下:
- 使Java方法在数据库事务中执行,而不必处理事务API。
- 使本地Java方法成为HTTP端点,而无需处理Servlet API。
- 使本地Java方法成为消息处理程序,而无需处理JMS API。
- 使本地Java方法成为管理操作,而无需处理JMX API。
依赖注入和控制反转
Java应用程序 - 指从受限制的嵌入式应用程序到n层服务器端企业应用程序 - 通常由协作形成应用程序的对象组成。因此,应用程序中的对象彼此依赖。
尽管Java平台提供了丰富的应用程序开发功能,但它缺乏将基本构建块组织成一个连贯整体的方法,将该任务留给架构师和开发人员。虽然您可以使用诸如Factory,Abstract Factory,Builder,Decorator和Service Locator 之类的设计模式来构成应用程序的各种类和对象实例,但这些模式只是:给出名称的最佳实践,描述为模式的作用,应用位置,解决的问题等等。模式是必须在应用程序中实现的正式最佳实践。
Spring框架控制反转(IoC)组件通过提供一种将不同组件组合成一个可以使用的完全工作的应用程序的形式化方法来解决这一问题。Spring Framework将形式化的设计模式编码为可以集成到您自己的应用程序中的对象。国外已经有许多组织和机构以这种方式使用Spring Framework来设计健壮,可维护的应用程序。
背景
“ 问题是,控制的哪些方面是[他们]反转? ”Martin Fowler 在2004年在他的网站上提出了关于控制反转(IoC)的 问题 .Fowler建议重新命名原则,使其更加不言自明,并提出依赖注入。
框架模块
Spring Framework由19个模块组成的功能组成。可分为 Data Access/Integration、Web、AOP and Instrumentation、 Core Container以及Test 这5组,如下图所示:等,如下图所示
1.1 Core Container - 核心容器
Spring Core Container 包含 spring-core, spring-beans, spring-context, spring-context-support, 以及 spring-expression (Spring Expression Language,Spring 表达式语言,SpEL)模块。
它们之间的完整依赖关系
其中,core 和 beans 模块提供了 Spring 框架的基础功能,包括控制反转(IoC)和依赖注入。BeanFactory 是工厂模式的一种复杂而精致的实现,它使开发者不再需要使用编码式单例(programmatic singletons),并可将配置和依赖从实际编码逻辑中解耦。
context 模块使得由 Core 和 Beans 提供的基础功能真正构建成坚实的基础:这意味着Spring 工程能以框架模式访问对象,类似于JNDI注册表。Context 模块继承了Beans 模块的特性并增加了对国际化(例如资源绑定)、事件传播、资源加载和context 透明化(例如 Servlet container)。同时,也支持JAVA EE 特性,例如 EJB、 JMX 和 基本的远程访问。Context 模块的关键是 ApplicationContext 接口。
下图是Spring工作原理的高级视图。您的应用程序类与配置元数据相结合,以便在ApplicationContext
创建和初始化之后,您拥有完全配置且可执行的系统或应用程序。
1.2 Data Access/Integration - 数据访问与集成
数据访问与集成层包含 JDBC、ORM、OXM、JMS和TX模块。
它们之间的完整依赖关系
数据访问与集成层包含 JDBC、ORM、OXM、JMS和事务模块。
spring-jdbc 模块提供了 JDBC抽象层,它消除了冗长的 JDBC 编码和对数据库供应商特定错误代码的解析。
spring-tx 模块支持编程式事务和声明式事务,可用于实现了特定接口的类和所有的 POJO 对象。编程式事务需要自己写beginTransaction()、commit()、rollback()等事务管理方法,声明式事务是通过注解或配置由 spring 自动处理,编程式事务粒度更细。
spring-orm 模块提供了对流行的对象关系映射 API的集成,包括 JPA、JDO 和 Hibernate 等。通过此模块可以让这些 ORM 框架和 spring 的其它功能整。
spring-oxm 模块提供了对 OXM 实现的支持,比如JAXB、XML Beans等。
spring-jms 模块包含生产(produce)和消费(consume)消息的功能
1.3 AOP
aop 模块提供了面向切面编程(AOP)的实现,可以定义诸如方法拦截器和切入点等,从而使实现功能的代码彻底的解耦。aspects 模块提供了对 AspectJ 的集成。
1.4 Instrumentation
instrument 模块提供了对检测类的支持和用于特定的应用服务器的类加载器的实现。
1.5 Web
Web 层包括 spring-web、spring-webmvc、spring-webmvc-portlet 等模块。
它们之间的完整依赖关系
spring-web 模块提供面向 web 的基本功能和面向 web 的应用上下文,比如 multipart 文件上传功能、使用 Servlet 监听器初始化 IoC 容器等。它还包括 HTTP 客户端以及 Spring 远程调用中与 web 相关的部分。
spring-webmvc 模块(即 Web-Servlet 模块)为 web 应用提供了模型视图控制(MVC)和 REST Web 服务的实现。Spring 的 MVC 框架可以使领域模型代码和 web 表单完全地分离,且可以与 Spring 框架的其它所有功能进行集成。
spring-webmvc-portlet 模块(即Web-Portlet模块)提供了用于 Portlet 环境的 MVC 实现,并反映了 pring-webmvc 模块的功能。
spring-test
模块通过 JUnit 和 TestNG 组件支持单元测试和集成测试。它提供了一致性地加载和缓存 Spring 上下文,也提供了用于单独测试代码的模拟对象(mock object)。