总结Spring各个版本特点,让Spring的发展进化流程清晰展现,帮助大家理解Spring源码。
从maven 可以下载到Spring各个版本,但是早期版本没有提供源代码。
一、Spring 1.0
Spring1.0正式版发布于2004年3月,下面是Spring1.0的目录结构,可以看到当时的Spring还是一个项目,所有功能都在一个包里面。
二、Spring 2.0
Spring2.0正式版发布于2006年10月,此时的Spring还是一个完整的项目
1、Spring的XML配置引入XML Schema语法简化配置
在Spring1.x系列中,bean的配置文件使用DTD,没有namespace的分隔。2.0的一个非常大的改进是引入了XML Schema的namespace,因而可以将bean的配置文件做大幅度的简化。这些简化包括了对bean属性的各种简化,AOP配置的简化,事务配置的简化,JNDI配置的简化等方面。当然,在简化配置的同时,新的XML Schema实际上引入了更多的XML语法,因此使用一个支持XML Schema的XML Editor就显得非常必要了,例如Eclipse WTP就可以提供Schema的语法自动提示和校验功能。
Spring1.x的bean配置文件逐渐复杂烦琐化,是Spring历来被人所垢病的主要问题之一。在Spring2.0里面XML Schema语法的配置可以在相当程度上降低配置文件的复杂程度和烦琐程度,可以视为Spring的重大改进之一。但是我们也必须看到XML Schema并没有从根源上面解决XML配置复杂的问题,而只是减轻。
将所有的bean之间的依赖关系,组装关系统统使用XML来描述,本身就会导致XML阅读和修改一定的困难。并且用XML配置本身无法直接进行单元测试来验证依赖关系。因此,当bean之间关系越复杂的时候,XML配置文件本身的维护也是一个负担。
2、提供了request和session范围的bean
引入request scope和session scope的bean,我感觉是把双刃剑。对于普通的Java Web框架应用来说,和Servlet容器相关的操作应该限制在Web层,对于业务层来说,不应该涉及request和session的scope,否则业务层代码无法脱离Servlet容器进行单元测试。对于使用Webwork/Struts框架的用户来说,恐怕不太会使用该特性,另外根据我的理解,也许request/session scope的bean也是为了提供给Spring MVC的Controller使用的。
除此之外,对于AJAX Web Service调用来说,这一特性反而是很有用处的。对于这种应用场景,JS通过AJAX调用,抛开Web层框架,直接访问业务层bean,这个时候就需要提供request/session scope的bean了。
3、集成AspectJ,可以管理容器外对象,提供了领域模型的依赖注入
通常由Hibernate管理的持久化对象PO,并不是由Spring容器初始化的,往往是用户自己new出来,或者通过find,load方法创建的,其结果就是Spring容器无法对这种容器外创建的对象进行bean依赖关系注入。
在Spring2.0中,可以使用AspectJ对领域模型进行静态织入,这样当该领域模型在容器外被创建的时候,会产生对容器的回调,进行依赖关系的注入。
Spring2.0提供的这一特性,确保了Martin Folwer的Rich Domain Object的可行性,这一特性的提供恐怕会对未来很多Java系统的设计产生相当深远的影响。
其实针对Rich Domain Object更进一步,如果将DAO功能作为Domain Object的抽象父类,那么持久化对象PO就会集PO,DAO,Service对象于一身,整个业务层,持久层完全合并为一个对象,通过这种方式进行框架简化得到的结果就是,高度类似于ruby on rails的full-stack的MVC框架。
4、JPA支持
这一点其实没有什么可点评的,提供JPA支持本来就是理所应当之事。
5、JDBC的NamedParameterJdbcTemplate
NamedParameterJdbcTemplate我认为意义非凡,为JDBC查询提供了带命名参数的占位符,而不止是JDBC自己的“?”,这样使用JDBC的时候,也可以很容易的构造出来带占位符的动态条件查询,而不是参数值带入方式的拼接SQL字符串了。
6、Spring Web MVC功能的大幅度扩充
看的出来,在Spring2.0里面 Web MVC功能大幅度扩充,过去不提供的UI Taglib也终于提供了,配置文件也进行了必要的简化。虽然Spring MVC从框架设计角度来说远远不如Webwork那么有创意,但是也是一步一个脚印的改进,再配合上各种外围框架例如Spring Webflow等的支持,可以预见Spring MVC会成长为Webwork的劲敌。
7、支持动态语言ruby,groovy,beanshell
动态语言支持目前看来还比较简单,不够强大,但是表明了Spring的一个态度,其实我个人希望Spring能够加强这方面支持,甚至大胆一点,提供用动态脚本语言编写的bean组装配置。
8、异步JMS支持,JMX支持,JCA支持的功能完善[/color]
Spring2.0自身提供了两类简单的JMS Containter,此外还提供了外部JMS Server的接口,另外JMX功能的支持,JCA功能的支持都在进一步的完善过程中。
Spring2.0在这几个方面的功能支持不是那么引入注目,毕竟普通Java Web应用很少使用这些方面。但是Spring提供这些功能的完善支持意义却很深远,因为这些功能都是J2EE规范所要求提供的功能,也是传统应用服务器厂商相对比Java开源框架的传统优势项目。一旦Spring2.0对这些功能提供了完善的支持,那么将传统的Java企业应用完全迁移到Spring框架上面的技术障碍就一扫而空了。
因此Spring是一个野心很大的框架,从现在状况来看,Spring可以说是Java开源框架之集大成者,从未来来看,Spring将提供J2EE厂商所能够提供的所有必要的功能,最终Spring将有可能取J2EE规范而代之,成为Java企业开发的事实平台和事实标准。
总体来说,Spring2.0将向未来的宏大目标又迈进了一大步。不过对于我等普通Java Web项目的开发需求来说,2.0的新特性也没有特别需要的。
三、Spring 2.5
Spring 2.5正式版于2007年11月发布,Spring2.5是Spring2.1各个里程碑版本的终结。Spring2.5是对Spring2.0的增强,增加了一些新的特性。
Spring 2.5特性如下:
01、全面支持java6和javaEE5(JDBC 4.0, JTA 1.1, JavaMail 1.4, JAX-WS 2.0等)
02、全特性的注释 驱动依赖注入,包括对限定词的支持
03、支持基于classpath的组件扫描,自动侦测有注释的类
半注解开发(属性注入不用配置了,但是bean本身还是需要在xml中配置),
<context:annotationconfig/>
将隐式地向 Spring 容器注册 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 以及 RequiredAnnotationBeanPostProcessor这 4 个 BeanPostProcessor。
使用 @Required注解,就必须声明RequiredAnnotationBeanPostProcessor
使用@Resource、@PostConstruct、@PreDestroy等注解就必须声明 CommonAnnotationBeanPostProcessor
使用@PersistenceContext注解,就必须声明 PersistenceAnnotationBeanPostProcessor的Bean
使用@Autowire注解,就必须声明AutowiredAnnotationBeanPostProcessor
基本全注解开发(全部bean不用在xml中配置,可自动扫描包,xml中配置这个启动配置)
<context:component-scan base-package="com.tanlan.springdemo"></context:component-scan>
04、支持AspectJ切点表达式中包含bean name切点元素
05、内置AspectJ加载时编织,基于LoadTimeWeaver 提取
06、更多的XML配置文件的名字空间支持,比如context和jms等,最大程度提高编写的方便性
07、全面修订集成测试框架,支持JUnit4和TestNG
08、新的基于注释的Servlet MVC和Portlet MVC控制器风格配置
09、扩展SimpleJdbcTemplate功能,支持命名的参数等
10、官方认可的Websphere支持,支持WebSphere 6 UOWManager 机制
11、Spring框架的jar文件,兼容OSGi绑定,并能直接使用
12、Spring ApplicationContext可被部署为JCA RAR文件,用于非主导应用模块
13、JCA 1.5消息终端管理,用于Spring管理的JMS和CCI消息监听器
14、有重要价值的特性为,基于注释的MVC控制器风格,JAX-WS支持和TestNG支持。
15、分发包有三种形式,增加了最小标准zip包和包含文档的zip包。
三、Spring 3.0
Spring 3.0发布于2009年12月,此时的Spring已经将一个项目拆分成多个进行维护。用户在使用的时候也需要分别引入。
四、Spring 4.0
五、Spring 5.0