在Java框架中,Spring可以说算是名声显赫的一个了,相信自Spring发布以来,它的思想以及它对Java EE的解决之道影响了无数的程序员的头脑以及项目的应用。现在Spring已经发布了2.0版本,意味着Spring进入了一个全新的时代。我的很多刚开始学习Spring的朋友经常问我:Spring2.0发布了,我们接下来该怎么学?Spring2.0还和以前的Spring一样么?以前学过了Spring,那么Spring2.0还需要重新学习么?。。。。。。是啊,引用一位大虾说过的话:IT真是哄眼球的地方。一个新的版本的发布就会让人摸不着头脑。那么,Spring2.0到底把Spring怎么样了呢?换句话说,Spring2.0,我们到底该拿你怎么办呢?
既然这样,我们在这里就主要的说一下Spring2.0到底怎么了。
一、 我们都知道,Spring的核心就是IoC容器。Spring的所有思想与特性就来自于这个核心的容器,所以可以预料,Spring2.0相当大的改进之一就是它的IoC容器。
1、 XML配置的改进
XML Schema这个强大的工具自从发布后就影响了一系列的项目。最有代表性的就是Servlet2.4的发布。基于最新XML Schema技术的Servlet配置文件的便利相信很多的人已经体会到了。而这次,Spring2.0的配置文件也不出所料的采用了XML Schema技术。基于XML Schema的XML配置语法使得Spring的XML配置变的更加简单了。新的标签更加易于阅读与维护。Spring2.0并没有完全抛弃Spring 1.2.x以前的版本,因此,以前的Spring配置文件同样可以使用。但是如果你正在构建一个新的基于Spring的Application的话,我们的建议还是使用更加简单的Spring2.0。
引用新的Spring2.0 DTD的DOCTYPE声明:
"http://www.springframework.org/dtd/spring-beans-2.0.dtd"> |
2、 新的bean的作用域
Spring的1.2.x版本支持的bean的作用域——如singleton——现在已经被Spring2.0的新作用域完全取代。如果你使用的是新的Spring2.0的DTD,那么它将不允许使用Spring上个版本的bean作用域。新的Spring2.0不仅提供了一些依赖Spring部署环境(比如web环境中的request和session作用域bean)的额外的作用域,而且提供了所谓的hooks可以使用户创造自己的作用域。你可以使用 “scope” 属性来定义bean的生命周期作用域。
3、 配置文件的可扩展性
基于新的XML Schema的XML配置文件不单更加的简单了,而且具有了可扩展性。它允许开发人员或者第三方框架或产品的供应商开发自定义的标签,并且把这些标签嵌入到自己的Spring配置文件里。你可以在组件的特定配置中定义自己的DSL(Domain Specific Language)。这样相信在不久的以后,会有第三方的供应商加入到Spring自定义标签的开发中,发布更加具有可应用性的实用标签。
二、 改进的面向方面编程(AOP)
Spring 2.0在AOP上有很大的改进。首先,AOP XML的配置更加简单了,Spring2.0引入了新的模式,支持定义从常规Java对象中发展来的切面,充分利用了AspectJ切入点语言,提供了完整类型的Advice(也就是没有多余转换和Object[] 参数操作)。另外,得意于Annotation的发展,Spring2.0提供了对@AspectJ切面的支持,这些切面可以在AspectJ与Spring AOP中共享,需要的仅仅是简单的配置。
三、 中间层
1、 在XML里更为简单的声明性事务配置
Spring2.0关于事务的配置方式发生了重大的变化。早先1.2.x版本的配置依然有效,但是新的方式更加简洁。Spring2.0同时提供了AspectJ库,你可以使用它来生成更漂亮的事务性对象——甚至可以不是用Spring IoC容器产生的。
2、 JPA的提供
Spring2.0提供了JPA抽象层,在所起的作用与常规使用模式上,类似于Spring的JDBC抽象层。
3、 异步的JMS
在Spring2.0之前,Spring的JMS的作用局限于发送消息和同步接收消息。这个功能封装在JmsTemplate中,并且不支持异步消息接收的功能。在Spring2.0中加入了异步的JMS功能,可以直接用消息驱动POJOs,非常方便。
4、 JDBC
在JDBC的支持库中,加入了几个新的类。首先是NamedParameterJdbcTemplate,提供了在编写JDBC语句时,对使用命名参数(与之相对的是编写JDBC语句的时候只使用常规的占位符(‘?’))的支持。
另外一个新类是SimpleJdbcTemplate,致力于在使用Java 5+开发时更加简单的使用JdbcTemplate。
四、 Web层
1、 Spring2.0 MVC JSP标签库进行了大的更新,你会发现在使用Spring MVC编写JSP页面时会变得更加简单。这些标签都是来自JIRA上Spring用户通过投票方式产生的,拥有很大的通用性!
2、 Spring MVC合理的默认值
对于很多项目而言,遵守建立好的规范,使用合理的默认值,是项目所必须的... 现在在SpringMVC里,惯例优先(convention-over-configuration)的观点有了明确的支持。 这就意味着当你为控制器和视图建立一系列的命名规范时,你可以 充分 减少XML配置的数量,包括设置处理映射、视图解析、ModelAndView的实例等等。 对于开发快速原型来说,这有非常大的优势,并且越过代码库可以产生一定的连续性(通常是良好的)。
3、 加入了新的框架——Portlet
Spring2.0加入了新的Portlet框架,可以支持JSR-168 Portlet开发。
五、 更多特性
1、 动态语言的支持
Spring2.0现在支持动态语言编写的bean,包括JRuby,Groovy和BeanShell。更多的提供了整合能力。
2、 JMX
Spring2.0开始支持Notification,还可以声明式的控制MBean在一个MBeanServer上的注册行为。
六、 更多的更改
1、 一些以前被标记为@deprecated的类和方法Spring 2.0代码库中被完全删除了。 Spring团队决定把2.0版本作为一个新的开始,那些被deprecated的代码应该被除去而不是在可预见的未来继续在代码中出现。
下面的类/接口已经从Spring 2.0的代码中删除了。
ResultReader : 使用RowMapper接口代替。
BeanReferenceFactoryBean : 使用别名机制代替
BeanDefinitionRegistryBuilder : 使用BeanDefinitionReaderUtils类上的方法代替
BeanFactoryBootstrap : 考虑使用一个BeanFactoryLocator 或是自定义引导类代替
RequestUtils : 使用ServletRequestUtils代替
2、 Spring主代码中的Apache OJB支持被完全删除了; 但仍然可以在Spring Modules项目中找到Apache OJB的集成库。
3、 iBATIS SQL Maps 1.3支持被完全去除了。如果你还在使用iBATIS SQL Maps 1.3, 请升级到iBATIS SQL Maps 2.0/2.1。
我们到底该怎么做?
说了这么多,那么我们到底该怎么办?是应该重新学习继续学习Spring 1.2.x版本然后再学习Spring2.0还是重新从头学习,亦或干脆放弃Spring?
我们的建议是这样的:
作为Spring用户,为了更多的历史遗留系统代码的维护,我们并不能完全放弃的Spring1.2.x,因此我们应该去了解Spring2.0的新特性以及使用方法,并积极升级现有系统到Spring2.0。
作为初学者,你完全可以不放弃你学过的Spring知识,只是在今后的学习中进行知识的升级,将你了解到的、学到的及时升级到Spring2.0。