在Java企业级开发,尤其是Web应用的开发中,你一定听说过Spring框架的大名。事实上Spring是使用最多的Java EE企业应用开源框架。那么什么是Spring框架?Spring框架又有哪些优势?本文将会逐一进行介绍。
一、Spring是什么
Spring是一个开源框架,它由 Rod Johnson 创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
Spring是一个轻量级的控制反转(IoC, Inversion of Control)和面向切面编程(AOP, Aspect-Oriented Programming)的容器框架。
轻量:从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
控制反转:Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
面向切面编程:Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
容器:Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
框架:Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。
二、Spring的起源
要谈Spring的历史,就要先谈J2EE。J2EE应用程序的广泛实现是在1999年和2000年开始的,它的出现带来了诸如事务管理之类的核心中间层概念的标准化,但是在实践中并没有获得绝对的成功,因为开发效率,开发难度和实际的性能都令人失望。
曾经使用过EJB开发JAVA EE应用的人,一定知道,在EJB开始的学习和应用非常的艰苦,很多东西都不能一下子就很容易的理解。EJB要严格地实现各种不同类型的接口,类似的或者重复的代码大量存在。而配置也是复杂和单调,同样使用JNDI进行对象查找的代码也是单调而枯燥。虽然有一些开发工作随着xdoclet的出现,而有所缓解,但是学习EJB的高昂代价,和极低的开发效率,极高的资源消耗,都造成了EJB的使用困难。而Spring出现的初衷就是为了解决类似的这些问题。
Spring的一个最大的目的就是使JAVA EE开发更加容易。同时,Spring之所以与Struts、Hibernate等单层框架不同,是因为Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。可以说Spring是一个提供了更完善开发环境的一个框架,可以为POJO(Plain Ordinary Java Object)对象提供企业级的服务。
Spring的形成,最初来自Rod Jahnson所著的一本很有影响力的书籍《Expert One-on-One J2EE Design and Development》,就是在这本书中第一次出现了Spring的一些核心思想,该书出版于2002年。另外一本书《Expert One-on-One J2EE Development without EJB》,更进一步阐述了在不使用EJB开发JAVA EE企业级应用的一些设计思想和具体的做法。
1、Spring的初衷
JAVA EE开发应该更加简单。
使用接口而不是使用类,是更好的编程习惯。Spring将使用接口的复杂度几乎降低到了零。
为JavaBean提供了一个更好的应用配置框架。
更多地强调面向对象的设计,而不是现行的技术如JAVA EE。
尽量减少不必要的异常捕捉。
使应用程序更加容易测试。
2、Spring的目标
可以令人方便愉快的使用Spring。
应用程序代码并不依赖于Spring APIs。
Spring不和现有的解决方案竞争,而是致力于将它们融合在一起。
3、Spring的基本组成
最完善的轻量级核心框架。
通用的事务管理抽象层。
JDBC抽象层。
集成了Toplink, Hibernate, JDO, and iBATIS SQL Maps。
AOP功能。
灵活的MVC Web应用框架。
三、Spring的优势
1、方便解耦,简化开发
通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于.上层的应用。
2、AOP编程的支持
通过Spring的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
3、声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量。
4、方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
5、方便集成各种优秀框架
Spring可以降低各种框架的使用难度,提供了对各种优秀框架( Struts、Hibernate、Hessian、Quartz等)的直接支持。
6、降低JavaEE API的使用难度
Spring对JavaEE API (如JDBC、JavaMail、 远程调用等)进行了薄薄的封装层,使这些API的使用难度大为降低。
7、Java源码是经典学习范例
Spring的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。它的源代码无意是Java技术的最佳实践的范例。
四、Spring的体系结构
下面用一张图来说明Spring的体系结构:
在Spring框架中,最重要的就是Spring的核心容器(Core Container),核心容器是整个Spring体系的基础,任何基于Spring Framework的应用都需要核心容器的支持。除此之外,Spring框架体系中还包括AOP(面向切面编程)、Spring JDBC(持久层)、Spring MVC(表现层)等。近些年来,Spring体系中又增加了Spring Boot 和 Spring Cloud,它们对微服务架构和服务器集群有着非常好的支持,下图为Spring官网的相关介绍:
若需获取更多内容,请访问:https://spring.io。