在1996年,Java语言兴起之时,因其Applet可以创建富客户端和动态的Web应用而受到广泛关注。然而Java语言因Applet而来,却是因组件化而留,因为Java可以使用模块化编程,从而用于构建复杂系统。后来,Sun公司发布了JavaBean主要用于构建用户界面窗口部件。随后,Sun又发布了EJB,提供了企业级服务,但是EJB却并没有使得企业级应用开发变得简单,反而使代码实现变得异常复杂。随后在JavaBean基础之上提供了EJB的强大功能,但是没有EJB那么复杂,基于POJO的编程模型得到了发展,而Spring就是其中领导者。
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的根本使命就是简化Java开发。
为了实现这个使命,Spring采取了一下四种关键策略:
1、基于POJO的轻量级和最小侵入性编程
包括EJB在内的许多框架都会要求应用继承框架中的类或实现框架中的接口,那怕很多继承和实现的方法对应用来时根本毫无意义,这就将应用和框架死绑在一起了。而Spring就是为了简化Java开发的复杂性,因此它竭力让自己的框架API不影响应用的开发,不强迫应用类继承框架类或者实现其接口,Spring尽量保证了应用类是POJO。
2、通过依赖注入和面向接口实现松耦合
Spring竭力保证应用类是POJO,这样可以有效降低代码的耦合度,但是一个完全不耦合的系统也很难实现有意义的功能,因此不同的类之间有一定的交互也是必须的,Spring通过依赖注入(DI)来组织协调各个对象之间的关系。
3、基于切面和惯例进行声明式编程
Spring通过依赖注入让相互协作的软件组保持松耦合,同时利用AOP编程将应用中的各个功能分离出来形成可重用的组件。
4、通过切面和模板减少样板式代码
很多时候,程序因为Java API会产生许多样本式代码,例如:在编写JDBC访问数据库的程序时,会有建立连接、关闭连接以及SQL异常处理等,这些程序并非核心代码,而核心的SQL语句反而没有凸现出来。Spring通过模板封装来消除样板式代码。
Spring通过常用的xml配置文件来来配置bean和实现AOP,这些配置加载的核心就是Spring的容器,spring的容器可以创建应用对象、装配并配置对象,管理着对象的整个生命周期。Spring的容器实现主要有Bean工厂和应用上下文,其中Bean工厂对应用来说太低级了,因此应用上下文得到了广泛的应用。
装配:创建应用组件之间协作的行为
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
完整的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中的各种模块提供了基础支持。