Spring框架简介

source:wikipedia

Spring框架是Java平台的一个开源的全栈应用程序框架和控制反转容器实现。该框架的核心功能可以用于任意Java程序,同时该框架还为Java EE (Enterprise Edition) 平台提供了用于构件web程序的扩展支持。尽管该框架没有实现任何编程模型,但是它已经在Java社区中广为流行,基本上完全代替了企业级JavaBeans (EJB) 模型。Spring框架是一款开源框架。

版本历史

Spring框架的第一个版本是由Rod Johnson编写的。2002年10月,Rod将其与自己的出版图书《Expert One-on-One J2EE Design and Development》一同发布。2003年6月,Spring框架第一次发布在Apache 2.0 许可证下。2004年3月,Spring框架的第一个里程碑式版本——1.0版本被发布。之后的两个里程碑式版本则分别于2004年9月以及2005年3月被发布。2006年,Spring框架1.2.6版本赢得了Jolt生产力奖项以及JAX (Java API for XML) 创新奖。Spring框架的2.0版本于2006年10月被发布,3.0版本于2009年12月被发布,4.0版本于2013年12月被发布。在4.0版本中,Spring框架增加了对Java SE 8,Groovy 2,Java EE 7以及WebSocket的支持。Spring框架的5.0版本于2017年9月被发布,该版本引入了 Spring WebFlux,一个高性能、响应式、异步的 Web 框架。同时其重点加强了对函数式编程以及响应式程序设计的支持能力。

模块

Spring框架提供模块来支持数量众多的服务,其核心模块有:

  • Spring核心容器:这是Spring框架的基础模块,提供Spring容器(BeanFactory与ApplicationContext)。
  • 面向切面的程序设计:允许实现横切关注点。
  • 身份验证与授权:通过Spring Security子程序实现的可配置安全进程,支持众多标准,协议以及工具。
  • 约定优于配置:Spring Roo模块为基于Spring框架的商业程序提供了一种快速的程序开发解决方案。
  • 数据访问:Spring框架支持在Java平台上运行的,并使用JDBC、对象关系映射工具以及NoSQL数据库的关系型数据管理系统。
  • 控制反转容器:程序元素配置以及Java对象生命周期主要由依赖注入实现。
  • 消息:在注册向Java消息服务(JMS)的消息队列进行透明消息消费的监听器对象时,可以对其进行配置。
  • MVC:Spring框架基于HTTP以及servlet,并且支持自定义web程序。
  • 远程访问:对于Java对象提供可配置的远程过程调用(RPC)风格的数据打包,支持Java远程方法调用(Java RMI)、通用对象请求代理架构(CORBA)以及基于HTTP的协议。
  • 事务管理:Spring框架整合了部分事务管理API并为Java对象协调事务。
  • 远程管理:通过Java管理扩展(JMX),Spring框架提供对于Java对象的本地或远程管理。
  • 测试:Spring框架支持用于写单元测试以及集成测试的类。

控制反转容器(依赖注入)

Spring框架的核心是其控制反转(IoC)容器,其利用反射提供了统一的用于配置以及管理Java对象的方法。该容器控制某些对象的声明周期:创建对象,调用构造方法以及配置对象。

由控制反转容器创建的对象也叫做被管理对象或者JavaBean。容器的配置可以通过加载XML文件或检测配置类的特定注解来实现。以上数据来源提供了创建JavaBean所需的Bean定义。

Java对象可以通过依赖查找或依赖注入来获得。依赖查找指调用者向容器请求一个具有特定名称或类型的对象的过程。依赖注入指容器通过构造器、properties或工厂方法传递对象的过程。

尽管使用控制反转容器能够使配置以及自定义程序变得容易,但是很多情况下开发者并不必须使用该容器。控制反转容器对于配置程序提供了统一的机制,并且该机制被集成在几乎所有的Java环境中,范围从小型程序覆盖到大型企业程序。

控制反转容器可以通过Pitchfork项目被转变成为一个部分一致的企业JavaBean(EJB)3.0容器。SpringSource并未将EJB 3.0一致性作为其主要目标,同时声明Spring框架以及控制反转容器可以实现更加强大的编程模型。程序员并不直接创建对象,而是在Spring框架配置文件中描述对象应该如何创建即可。类似地,服务以及元素也并没有被直接调用,实际上一份Spring配置文件定义了哪些服务与元素需要被调用。控制反转主要为了降低程序维护与运行的难度。

面向切面编程(AOP)框架

Spring框架包含有面向切面编程框架,用于对切面中的横切关注点进行模块化。创建一个独立的AOP框架出于以下考虑:Spring框架在程序设计、实现以及配置的过程中应该以较低的复杂度提供基本的AOP特性。Spring AOP框架充分地利用了Spring核心容器。

Spring AOP框架基于代理模式工作,并且在运行时被配置。这样便不需要编译步或加载时织入。同时,拦截机制仅允许执行当前处于连接点上的对象的公有方法。

与AspectJ框架相比,Spring AOP框架在性能方面稍显逊色,但是也更加简洁。Spring框架1.2版本开始支持在容器内配置AspectJ切面。2.0版本进一步添加了对AspectJ框架的支持。例如,切入点语言被重复利用,并且可与基于Spring AOP的切面相混合。同时Spring框架2.0版本添加了一个使用AspectJ的Spring切面库。该库提供一些Spring特性,例如通过AspectJ编译时织入或加载时织入实现的声明式事务管理及依赖注入。除Spring框架之外,SpringSource还将AspectJ AOP框架用至Spring Roo以及Spring Insight等Spring项目。Spring Security也提供基于AspectJ的切面库。

Spring AOP框架的设计使其支持Spring框架内部的横切关注点。任何由Spring核心容器创建与配置的对象均可被Spring AOP框架增强。

Spring框架将Spring AOP框架用于事务管理、安全、远程访问以及远程管理。

从2.0版本开始,Spring框架提供两种配置AOP的方式:

  • schema配置以及
  • @AspectJ注解
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:mvc="http://www.springframework.org/schema/mvc" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:aop="http://www.springframework.org/schema/aop" 
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/aop 
       http://www.springframework.org/schema/aop/spring-aop.xsd">

由于Spring团队决定不引入新的AOP相关术语,所以在Spring框架参考文档以及API中,切面、连接点、通知、切入点、简介、目标对象以及AOP代理等术语拥有与在其他大多数AOP框架中相同的意思(尤其是AspectJ框架)。

数据访问框架

Spring框架的数据访问框架用于处理开发者在程序中使用数据库时遇到的困难。Spring框架支持所有主流的Java数据库访问框架:JDBC,IBatis/MyBatis,Hibernate,JDO,JPA,Oracle TopLink,Apache OJB以及Apache Cayenne等。

对于所有受支持的数据库访问框架,Spring框架提供以下特性:

  • 资源管理 - 自动获取与释放数据库资源。
  • 异常处理 - 将与数据访问有关的异常转换为Spring数据访问层次结构。
  • 事务参与 - 对于正在进行的事务的透明参与。
  • 资源解包 - 从连接池包装类型中提取数据库对象。
  • 对于大型二进制对象以及大型字符型对象进行抽象化处理。

所有特性在使用Spring框架提供的模板类之后可用。批评者认为模板类破坏了其它数据库访问框架的一致性,并且不如直接使用Hibernate API。作为回应,Spring框架开发者添加了对直接使用Hibernate API与JPA API的支持。不过这仍需要透明事务管理,因为程序代码不再承担获取与释放数据库资源的责任,并且也不支持异常转换。Spring框架的数据访问框架与其事务管理机制提供了对其它数据库访问框架的抽象化处理。Spring框架并不提供公共的数据访问API。实际上,对于受支持的数据库访问API的访问方式并未改变。Spring框架是Java语言中唯一一个在程序服务器或容器外提供数据访问环境的框架。

在Spring框架中使用Hibernate进行事务管理时,需要配置如下的Beans:

  • 一个数据源,例如
    com.mchange.v2.c3p0.ComboPooledDataSource

    org.apache.commons.dbcp.BasicDataSource
  • 一个拥有数据源属性的会话工厂,例如
    org.springframework.orm.hibernate3.LocalSessionFactoryBean
  • 一个HibernateProperties,例如
    org.springframework.beans.factory.config.PropertiesFactoryBean
  • 一个事务管理器,例如
    org.springframework.orm.hibernate3.HibernateTransactionManager

事务管理

Spring框架的事务管理框架为Java平台提供了抽象化机制,具有以下特性:

  • 管理局部与全局事务(局部事务不需要程序服务器)
  • 管理嵌套事务
  • 管理保存点(savepoint)
  • 几乎可以工作在Java平台的所有环境中

与Java事务API(JTA)相比,JTA仅支持嵌套事务以及全局事务,并且始终需要程序服务器(在某些情况下还需要在程序服务器中部署程序)。

Spring框架使用平台事务管理器来实现众多事务管理策略,例如:

  • 由JDBC连接管理的事务
  • 由对象关系映射工作单元管理的事务
  • 通过JTA事务管理器以及用户事务管理的事务
  • 由对象、数据库等其它来源管理的事务

除了抽象化机制以外,事务管理框架还提供了两种向程序添加事务管理的方式:

  • 以编程方式使用Spring框架的事务模版
  • 以配置方式使用XML或Java注解等元数据

使用Spring框架的数据访问框架(该框架已集成事务管理框架)可以通过配置建立一个不依赖于JTA或EJB的事务系统。Spring框架的事务管理框架同时也集成了消息与缓存引擎。

MVC框架

Spring框架拥有自己的模型-视图-控制器(MVC)Web程序框架。Spring框架开发者最初并未打算为Spring构建MVC框架,但是他们认为当时主流的Jakarta Struts Web框架的设计过于简陋,其它可供替代的框架也有缺陷,尤其是在界面与请求处理层以及在请求处理层与模型之间的分离不充分。为了改进这些缺陷,他们为Spring框架构建了自己的MVC框架。

与Struts框架相同,Spring MVC也是基于请求的框架。其为每个必须被基于请求框架处理的责任定义一个策略接口。每个接口力求被定义得简单明晰,这样Spring MVC用户便可以轻松编写自己的实现。MVC推动了前端代码的进一步简洁化。所有接口都与Servlet API紧密结合。一些人认为这种结合表明了Spring开发者无法为基于Web的应用程序提供高等级的抽象。不过这种结合确保了开发者可使用Servlet API的特性。

DispatcherServlet类是框架的前部控制器,它负责在HTTP请求的执行阶段将控制权转交给各种接口。Spring MVC定义的重要接口及其职责如下所示:

  • Controller:在模型与视图之间管理新提交的请求并重定向至正确的响应。Controller将HTTP请求映射至对应的方法。
  • HandlerAdapter:对类接口进行适配。
  • HandlerInterceptor:对新提交的请求进行拦截。不等同于Servlet过滤器。
  • HandlerMapping:根据请求的属性为其选择合适的处理对象。
  • LocaleResolver:为用户解析与保存区域设置。
  • MultipartResolver:通过打包请求使得文件上传更加方便。
  • View:负责向客户端返回响应。有些请求可能直接来到视图而不经过模型部分,而其他的请求则会经过MVC所有三个部分。

以上所有的策略接口在整体的框架中都具有重要的职责。这些接口提供的抽象是强大的,所以他们的实现允许很多的修改。Spring MVC为这些接口提供了实现,同时基于Servlet API提供了一系列特性。开发者可以自由地修改这些实现。Spring MVC使用java.util.Map接口作为模型的面向数据的抽象,其中的键为string类型。

对于实现的接口的测试简便性被视为是Spring MVC高等级抽象提供的一大好处。DispatcherServlet与Spring控制反转容器紧密结合,用来配置Web层程序。不过Web程序也可以选择不使用Spring MVC而使用Spring框架的其他部分。

posted @ 2020-10-15 21:28  xywei0905  阅读(175)  评论(0)    收藏  举报