Spring Framework简介

 

做者关于此主题早期文章html

 Spring框架快速入门web

起源

要谈Spring的历史,就要先谈J2EE。J2EE应用程序的普遍实现是在1999年和2000年开始的,它的出现带来了诸如事务管理之类的核心中间层概念的标准化,可是在实践中并无得到绝对的成功,由于开发效率,开发难度和实际的性能都使人失望。spring

曾经使用过EJB开发J2EE应用的人,必定知道,在EJB开始的学习和应用很是的艰苦,不少东西都不能一会儿就很容易的理解。EJB要严格地实现各类不一样类型的接口,相似的或者重复的代码大量存在。而配置也是复杂和单调,一样使用JNDI进行对象查找的代码也是单调而枯燥。虽然有一些开发工做随着xdoclet的出现,而有所缓解,可是学习EJB的高昂代价,和极低的开发效率,极高的资源消耗,都形成了EJB的使用困难。而Spring出现的初衷就是为了解决相似的这些问题。数据库

Spring的一个最大的目的就是使J2EE开发更加容易。同时,Spring之因此与Struts、Hibernate等单层框架不一样,是由于Spring致力于提供一个以统一的、高效的方式构造整个应用,而且能够将单层框架以最佳的组合揉和在一块儿创建一个连贯的体系。能够说Spring是一个提供了更完善开发环境的一个框架,能够为POJO(Plain Old Java Object)对象提供企业级的服务。express

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. Spring IoC容器

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)。