在Spring框架没有开发出来时,Java EE是以Sun公司(已经被Oracle公司收购,不复存在,但为了纪念其对Java发展进程的巨大影响力,全书还是保留其名称,以表致敬之意)所制定的EJB(Enterprise Java Bean)作为标准的。在“遥远”的EJB年代,开发一个EJB需要大量的接口和配置文件,直至EJB 2.0的年代,开发一个EJB还需要配置两个文件,其结果就是配置的工作量比开发的工作量还要大。其次EJB是运行在EJB容器中的,而Sun公司定义的JSP和Servlet却是运行在Web容器中的,于是你可以想象得到,你需要使用Web容器去调用EJB容器的服务。这就意味着存在以下的弊端:需要增加调用的配置文件才能让Web容器调用EJB容器;与此同时需要开发两个容器,非常多的配置内容和烦琐的规范导致开发效率十分低下,这非常让当时的开发者诟病;对于Web容器调用EJB容器的服务这种模式,注定了需要通过网络传递,造成性能不佳;对于测试人员还需要了解许多EJB烦琐的细节,才能进行配置和测试,这样测试也难以进行。

就在大家诟病EJB的时候,2002年澳大利亚工程师Rod Johnson(论学历他应该是音乐家,因为他是音乐博士)在其著名的著作Expert One-on-One J2EE Design and Development中提出了Spring的概念。按书中的描述,Spring是如下的框架。

We believe that:

J2EE should be easier to use.

It is best to program to interfaces, rather than classes. Spring reduces the complexity cost of using interfaces to zero.

JavaBean offers a great way of configuring applications.

OO design is more important than any implementation technology, such as J2EE.

Checked exceptions are overused in Java. A platform should not force you to catch exceptions you are unlikely to recover from Testability is essential and a platform such as spring should help make your code easier to test.

We aim that:

Spring should be a pleasure to use.

Your application codes should not depend on Spring APIs.

Spring should not compete with good existing solutions, but should foster integration.

然后在2004年由Rod Johnson主导的Spring项目推出了1.0版本,这彻底地改变了Java EE开发的世界,很快人们就抛弃了繁重的EJB的标准,迅速地投入到了Spring框架中,于是Spring成为了现实中Java EE开发的标准。Spring以强大的控制反转(IoC)来管理各类Java资源,从而降低了各种资源的耦合;并且提供了极低的侵入性,也就是使用Spring框架开发的编码,脱离了Spring API也可以继续使用;而Spring的面向切面的编程(AOP)通过动态代理技术,允许我们按照约定进行配置编程,进而增强了Bean的功能,它擦除了大量重复的代码,如数据库编程所需大量的try...catch...finally...语句以及数据库事务控制代码逻辑,使得开发人员能够更加集中精力于业务开发,而非资源功能性的开发;Spring还提供许多整合了当时非常流行的框架的模板,如持久层Hibernate的HibernateTemplate模板、iBATIS的SqlMapClientTemplate模板等,极大地融合并简化了当时主流技术的使用,使得其展示了强有力的生命力,并延续至今。

值得一提的是,EJB 3.0的规范也引入了Spring的理念,而且整合了Hibernate框架的思想,但是也未能挽回其颓势,主要原因在于它的规范还是比较死板,而且比较难整合其他开源框架。其次,它运行在EJB容器之中,使用上还是比较困难,性能也不高。