Spring框架概述

简介:
SPRING框架——由来和发展
  Springjava平台上的一个开源应用框架。它的第一个版本是由Rod Johnson写出来的。Rod在他的Expert One-On-One Java EE Design and Development(Java企业应用设计与开发的专家一对一)一书中首次发布了这个框架。该框架也可以移植到.NET的环境下。
  Spring的框架首次在20036月的Apache 2.0的使用许可中发布。第一个具有里程碑意义的版本是20043月发布的1.020049月和20053月先后又有重要的版本面世。
  Spring框架本身并没有强制实行任何特别的编程模式。在Java社区里,Spring作为EJB模型之外的另外一个选择甚至是替代品而广为流行。从设计上看,Spring给予了Java程序员许多的自由度,但同时对业界常见的问题也提供了良好的文档和易于使用的方法。
  Spring框架的核心功能在任何Java应用中都是适用的。在基于Java企业平台上的web应用中,大量的拓展和改进得以形成。为此,Spring获得了广泛的欢迎,并被许多公司认可为具有战略意义的重要框架。
  1. Spring框架的历史
  Spring框架最开始的部分是由Rod Johnson2000年为伦敦的金融界提供独立咨询业务时写出来的。在《Java企业应用设计与开发的专家一对一》一书中,Rod进一步拓展了他的代码,以阐述如何让应用程序能以超出当时大众所惯于接受的易用性和稳定性与J2EE平台上的不同组件合作的观点。
  在2001年,web应用的主流编程模式为Java Servlet APIEJB。两者都是由太阳微系统公司与其他一些开发商和利益团体提出的,并在Java业界里获得了广泛的共识。那些非Web的应用,比如用户端的或批处理的应用,也可以基于能够提供所需功能的开源或商用工具和项目。
  基于最优方法并适用于各种应用类型的Spring框架的建立要归功于Rod Johnson。这些想法也在他的书中得以阐述。书发表后,基于读者的要求,源代码在开源使用协议下得以提供。
  一批自愿拓展Spring框架的程序开发员组成了团队,20032月在Sourceforge上构建了一个项目。在Spring框架上工作了一年之后,这个团队在20043月发布了第一个版本(1.0)。这个版本之后,Spring框架在Java社区里变得异常流行,部分的要归结于它好于一般水准的文档功能和参考文献,特别是对于一个开源项目而言尤其如此。
  但是,Spring框架在2004年也备受批评,有时它也成为热烈争论的主题。Spring的第一个版本发布时,许多程序员和领先的设计人员把它看作是远离传统编程模式的一步;特别是对于EJB而言尤其如此。Spring框架的一个重要设计目标就是更容易地与已有的J2EE标准和商用工具整合。在很大程度上,这个目标使得通过受争议的官方委员会控制的规范文档来定义功能变得可有可无。
  Spring框架使之前并不受欢迎的技术在短时间内迅速走红,最有名的例子就是反向控制(IOC)2004年,Spring框架的采用率非常之高;通过推出自身的AOP(面向方向的编程)Spring使AOP整体而言在Java社区里广受欢迎。
  2005年,Spring因具有里程碑意义的新的版本的推出,更多功能的添加,从而得到了比2004年更高的采用率。2004年底创建的Spring论坛也对框架的推广而推波助澜。论坛对广大用户而言已经成为最重要的信息和帮助的源泉。
  2005年,Spring框架的开发人员成立了自己的公司,来提供对Spring的商业支持,其中最显著的就是与BEA的合作。200512月,第一个Spring会议在迈阿密举行,3天的课程吸引了300名开发人员。20066月在安特卫普召开的会议有400多名开发人员。
  2. Spring框架的主要功能
  • 基于Java Beans的配置管理,采用IOC的原理,特别是对依赖注射技术的使用。这些都用来减少各组件间对实施细则的相互依赖性。
  • 一个核心的,全局适用的bean工厂
  • 一个一般抽象化的层面来管理数据库间的数据处理
  • 建立在框架内的,对Java数据处理API和单独的JDBC数据源的一般性策略。因此,在数据处理支持上对Java企业版本环境的依赖性得以消除
  • 和一些可持续性的框架,如HibernateJDOiBATISdb4o,的整合
  • web应用中的MVC框架,基于核心的Spring功能,支持多种产生视图的技术,包括JSPFreeMarkerVelocityTilesiText,和POI
  • 大量的AOP框架以提供诸如数据处理管理的服务。同IOC的功能一样,目的是提高系统的模块化程度
Spring 框架的七个模块
  Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图 1 所示。
  
  组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
  核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDIEJB、电子邮件、国际化、校验和调度功能。
  Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOPSpring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
  Spring DAOJDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  Spring ORMSpring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDOHibernate  iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSPVelocityTilesiText  POI
  Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web  EJB)、独立应用程序、测试环境之间重用。
Spring框架的主要功能
  组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
  核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDIEJB、电子邮件、国际化、校验和调度功能。
  Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOPSpring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
  Spring DAOJDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  Spring ORMSpring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDOHibernate  iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSPVelocityTilesiText  POI
  Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web  EJB)、独立应用程序、测试环境之间重用。
Spring事务管理
  在学习spring事务管理时,我忍不住要问,spring为什么进行事务管理,spring怎么进行的事务管理?
  首先,为什么要进行事务,接下来说说spring是怎样进行事务管理的.
   Spring事务策略
  Spring事务策略,也就是spring事务管理的实现方式.它有一个统一的抽象是由实现下面这个接口完成的.
  org.springframework.transaction.PlatformTransactionManager
  此接口的内容如下:
  Public interfacePlatformTransactionManager()...{
  TransactionStatue getTransaction(TransactionDefinition definition) throws TransactionException;
  Void commit(TransactionStatus status) throws TransactionException;
  Void rollback(TransactionStatus status) throws TransactionException;
  }
  不管是声明式的还是编程式的事务管理都需要此抽象来完成.
  解释一下这个接口,这样可以更好的理解spring的事务控制的原理.
  getTransaction()根据类型为TransactionDefinition的参数返回一个TransactionStatus对象.返回的TransactionStatus对象可能代表一个新的或已经存在的事务(如果在当前调用堆栈有一个符合条件的事务).如同J2EE事务上下文,一个TransactionStatus也是和执行的线程关联的.
  同时,在框架中还存在TransactionDefinition接口,即上边的参数类型.此接口指定了事务隔离程度、事务传播、事务超时、只读状态。
  另外,还有TransactionStatus接口。这个接口为处理事务提供简单的控制事务执行和查询事务状态的方法。
   两种事务管理方式:编程式、声明式。
  Spring提供两种方式的编程式事务管理,分别是:使用TransactionTemplate和直接使用PlatformTransactionManager
  . TransactionTempale采用和其他Spring模板,如JdbcTempalteHibernateTemplate一样的方法。它使用回调方法,把应用程序从处理取得和释放资源中解脱出来。如同其他模板,TransactionTemplate是线程安全的。
  代码片段:
  Object result =tt.execute(newTransactionCallback()...{
  publicObject doTransaction(TransactionStatus status)...{
  updateOperation();
  returnresultOfUpdateOperation();
  }
  });
  使用TransactionCallback()可以返回一个值。
  如果使用TransactionCallbackWithoutResult则没有返回值。
  也可以使用PlatformTransactionManager直接管理事务。简单地通过一个bean引用给你的bean传递一个你使用的PlatformTransaction对象。然后,使用TransactionDefinitionTransactionStatus对象就可以发起、回滚、提交事务。
  如下片段:
  DefaultTransactionDefinition def=newDefaultTransactionDefinition(); //new 一个事务
  def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); //初始化事务,参数定义事务的传播类型;
  TransactionStatus status =transactionManager.getTransaction(def); //获得事务状态
  try...{
  ……………..
  transactionManager.commit(status); //提交事务;
  }catch(…..)...{
  transactionManager.rollback(status); //回滚事务;
  }
  Spring也提供声明式事务管理。这是通过AOP实现的。
  大多数Spring用户选择声明式事务管理,这是最少影响应用代码的选择,因而这是和非侵入性的轻量级容器的观念是一致的。
   通常通过TransactionProxyFactoryBean设置Spring事务代理。需要一个目标对象包装在事务代理中。这个目标对象一般是一个普通Javabean。当我们定义TransactionProxyFactoryBean时,必须提供一个相关的PlatformTransactionManager的引用和事务属性。事务属性含有事务定义。例如:
  PROPAGATION_REQUIRED,-MyCheckedException
  PROPAGATION_REQUIRED
  PROPAGATION_REQUIRED,readOnly
  事务代理会实现目标对象的接口:这里是属性名是target的引用。idtransactionServiceControl(●使用CGLIB也可以实现具体类的代理。只要设置proxyTargetClass属性为true即可。如果目标对象没有实现任何接口,这将自动设置该属性为true。通常,我们希望面向接口编程。) ●使用proxyInterfaces属性来限定事务代理来代理指定接口也是可以。也可以通过从org.springframework.aop.framework.ProxyConfig继承或所有AOP代理工厂共享的属性来定制TransactionProxyFactoryBean行为。
  然后,说说属性名是transactionAttributes意义:
  这里的transactionAttributes属性是定义在org.springframework.transaction.interceptor.NameMathTransactionAttributeSource中的属性格式设置。这个包括通配符的方法名称映射是很直观的,如”insert*”。注意insert*的映射的值包括回滚规则。”-MyCheckException”指定如果方法抛出MyCheckException或它的子类,事务会自动回滚。可以用逗号分隔多个回滚规则。“-”前缀强制回滚,“+”前缀指定提交(这允许即使抛出unchecked异常时也可以提交事务)“PROPAGATION_REQUIRED”指定事务传播范围。
  TransactionProxyFactoryBean允许你通过“preInterceptors”“postInterceptors”属性设置前或后的拦截操作。可以设置任意数量的前和后通过,它们的类型可以是Advistor(切入点)MethodInterceptor或被当前Spring配置支持的通知类型。例如:ThrowAdviceAfterReturningAdviceBeforeAdvice。这些通知必须支持实例共享模式。如果你需要高级AOP特性操作事务,通过org.springframework.aop.framework.ProxyFactoryBean,而不是TransactionProxyFactory实用代理创建者。
   另一种声明方式:BeanNameAutoProxyCreator
  使用TransactionProxyFactoryBean当事务代理包装对象,你可以完全控制代理。如果需要用一致方式包装大量bean。使用一个BeanFactoryPostProcessor的一个实现,BeanNameAutoProxyCreator,可以提供另外一种方法。(Spring中,一旦ApplicationContext读完它的初始化信息,它将初始化所有实现BeanPostProcessor接口的bean,并且让它们后处理ApplicationContext中所有其他的bean。所以使用这种机制,正确配置的BeanNameAutoProxyCreator可以用来后处理所有ApplicationContext中所有其他的bean),并且把它们用事务代理包装起来。真正生成的事务代理和使用TransactionProxyFactoryBean生成的基本一致。
  最后,总结一下Spring的优点:
  Springjava平台上的一个开源应用框架。 Spring框架本身并没有强制实行任何特别的编程模式。在Java社区里,Spring作为EJB模型之外的另外一个选择甚至是替代品而广为流行。从设计上看,Spring给予了Java程序员许多的自由度,但同时对业界常见的问题也提供了良好的文档和易于使用的方法。 Spring框架的核心功能在任何Java应用中都是适用的。在基于Java企业平台上的web应用中,大量的拓展和改进得以形成。为此,Spring获得了广泛的欢迎,并被许多公司认可为具有战略意义的重要框架。









本文转自 weijie@java 51CTO博客,原文链接:http://blog.51cto.com/weijie/68546,如需转载请自行联系原作者
目录
相关文章
|
1天前
|
前端开发 Java 数据库连接
Spring框架初识
Spring 是一个分层的轻量级开源框架,核心功能包括控制反转(IOC)和面向切面编程(AOP)。主要模块有核心容器、Spring 上下文、AOP、DAO、ORM、Web 模块和 MVC 框架。它通过 IOC 将配置与代码分离,简化开发;AOP 提供了声明性事务管理等增强功能。
33 21
Spring框架初识
|
8天前
|
XML Java 开发者
通过springboot框架创建对象(一)
在Spring Boot中,对象创建依赖于Spring框架的核心特性——控制反转(IoC)和依赖注入(DI)。IoC将对象的创建和管理交由Spring应用上下文负责,开发者只需定义依赖关系。DI通过构造函数、setter方法或字段注入实现依赖对象的传递。Spring Boot的自动配置机制基于类路径和配置文件,自动为应用程序配置Spring容器,简化开发过程。Bean的生命周期包括定义扫描、实例化、依赖注入、初始化和销毁回调,均由Spring容器管理。这些特性提高了开发效率并简化了代码维护。
|
19天前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
110 29
|
1月前
|
开发框架 运维 监控
Spring Boot中的日志框架选择
在Spring Boot开发中,日志管理至关重要。常见的日志框架有Logback、Log4j2、Java Util Logging和Slf4j。选择合适的日志框架需考虑性能、灵活性、社区支持及集成配置。本文以Logback为例,演示了如何记录不同级别的日志消息,并强调合理配置日志框架对提升系统可靠性和开发效率的重要性。
|
2月前
|
Java 开发者 Spring
理解和解决Spring框架中的事务自调用问题
事务自调用问题是由于 Spring AOP 代理机制引起的,当方法在同一个类内部自调用时,事务注解将失效。通过使用代理对象调用、将事务逻辑分离到不同类中或使用 AspectJ 模式,可以有效解决这一问题。理解和解决这一问题,对于保证 Spring 应用中的事务管理正确性至关重要。掌握这些技巧,可以提高开发效率和代码的健壮性。
128 13
|
2月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
2月前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
80 5
|
2月前
|
缓存 Java 数据库连接
Spring框架中的事件机制:深入理解与实践
Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
89 8
|
2月前
|
XML 安全 Java
|
3月前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
135 0