阅读 111

Spring从入门到放弃(一)Spring的诞生

Spring的作者

Spring的缔造者Rod Johnson。这位仁兄很牛,出生于澳大利亚,毕业于悉尼大学计算机系。到这还是平平无奇,但是他还有另一个身份,音乐学的博士。因为自己爱好音乐,便攻读了音乐学的博士。果然编程的极致是艺术,而艺术相通的。

一本名为Expert one-on-one J2EE Development without EJB的书。在本书中,他提出了一种基于普通Java类(POJO)和依赖注入的简单解决方案。他编写了超过30,000行基础设施代码,其中包括许多可重用的Java接口和用于开发应用程序的类。

还没有读过的小伙伴建议精读一下,虽然距今年代久远,但其中不乏J2EE, 架构等经典之作,更是Spring整体框架的设计之源,包括后续的IOC思想之由来等。Rod随后创办Interface21, 开创Spring框架,而之后的Spring如日中天,无需多言。笔者曾戏称:

"In the real world, J2EE ONLY define Interface, Spring will implement".

而Rod在Java领域的影响已经远远超越了Spring本身的范畴。

2003年2月左右,Rod,Juergen和Yann开始合作开展Spring项目。给出了“Spring”这个名称,因为它意味着在传统J2EE的“Winter”之后重新开始。

Spring之前的历史

在Spring框架没有开发出来时,Java EE是以Sun公司(已经被Oracle公司收购,不复存在)所制定的EJB(Enterprise Java Bean)作为标准的。

在“遥远”的EJB年代,开发一个EJB需要大量的接口和配置文件,直至EJB 2.0的年代,开发一个EJB还需要配置两个文件,其结果就是配置的工作量比开发的工作量还要大。

其次EJB是运行在EJB容器中的,而Sun公司定义的JSP和Servlet却是运行在Web容器中的,于是你可以想象得到,你需要使用Web容器去调用EJB容器的服务。

这就意味着存在以下的弊端:需要增加调用的配置文件才能让Web容器调用EJB容器;与此同时需要开发两个容器,非常多的配置内容和烦琐的规范导致开发效率十分低下,这非常让当时的开发者诟病;对于Web容器调用EJB容器的服务这种模式,注定了需要通过网络传递,造成性能不佳;对于测试人员还需要了解许多EJB烦琐的细节,才能进行配置和测试,这样测试也难以进行。

就在大家诟病EJB的时候,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.

Spring的诞生

在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容器之中,使用上还是比较困难,性能也不高。