spring2.0-2.5-3.0变化(整理)

1、 spring 2.0 升级到 spring 2.5

在spring2.0升级到spring2.5时问题:
第一个问题就是在更换spring.jar后,启动项目时,出现 java.lang.ClassNotFoundException:      
           org.springframework.web.struts.ContextLoaderPlugIn 错误,

其次就是在spring2.5中缺少了一个JAR:spring-mock.jar。我在spring2.5的压缩包里没有找到这个JAR,不过发现了mock的一个源码文件夹。
其实这两个问题都是spring2.5的jar包里没有附带这些类,而是单独放在其它JAR里,详细说明如下:
在Spring 2.5中, Spring Web MVC 不再是 'spring.jar' 文件的一部分. Spring MVC以'spring-webmvc.jar' 和'spring-webmvc-portlet.jar'文件形式在发行包的 lib/modules 目录中存在。 另外,对Struts 1.x的支持被独立成 'spring-webmvc-struts.jar'。
注意: 经常被使用的Spring的DispatcherServlet也是Spring Web MVC框架的一部分。因此,就算你只是为了远程访问(例如,暴露Hessian或者 HTTP调用服务)而使用DispatcherServlet,你也得将'spring-webmvc.jar'(或者 'spring-webmvc-portlet/struts.jar')放到'spring.jar'旁边去。
Spring 2.5的 'spring-test.jar' 取代了'spring-mock.jar',表达其对test context framework的强烈关注。 注意 'spring-test.jar' 包含了上个版本 'spring-mock.jar'中的一切,因此如果是单元或集成测试,可以直接取代
解决办法:第一个问题是因为我的系统使用的是Struts1.2,所以还应该加入'spring-webmvc-struts.jar'包就可以了。
第二个问题只要加入'spring-test.jar' 包就可以了,应该说,还是比较容易解决的,只要我们了解一下spring2.5与2.0的差别就会知道了。

2、 2.5的新特性

spring2.0与spring2.5的差别
2.1支持的JDK版本:
Spring 2.5对JDK 1.3已经不再支持,因为Sun官方从2006晚期已经正式将JDK 1.3淘汰。请升级到JDK 1.4.2或更高版本。
Spring 2.5的Jar打包
◆在Spring 2.5中, Spring Web MVC 不再是 'spring.jar' 文件的一部分. Spring MVC以'spring-webmvc.jar' 和'spring-webmvc-portlet.jar'文件形式在发行包的 lib/modules 目录中存在。 另外,对Struts 1.x的支持被独立成 'spring-webmvc-struts.jar'。
  注意: 经常被使用的Spring的DispatcherServlet也是Spring Web MVC框架的一部分。因此,就算你只是为了远程访问(例如,暴露Hessian或者 HTTP调用服务)而使用DispatcherServlet,你也得将'spring-webmvc.jar'(或者 'spring-webmvc-portlet/struts.jar')放到'spring.jar'旁边去。
◆Spring 2.0的 'spring-jmx.jar' 和 'spring-remoting.jar'已经被转移到 Spring 2.5的'spring-context.jar' (针对 JMX 和非HTTP 远程支持),部分转移到 'spring-web.jar' (针对HTTP 远程支持)。
◆Spring 2.0的 'spring-support.jar' 被改名为 'spring-context-support.jar', 更好的表达其真实含义。 'spring-portlet.jar' 被改名为 'spring-webmvc-portlet.jar',表明它是Spring Web MVC framework的子模块之一。 类似的, 'spring-struts.jar' 被改为'spring-webmvc-struts.jar'。
◆Spring 2.0的'spring-jdo.jar', 'spring-jpa.jar', 'spring-hibernate3.jar', 'spring-toplink.jar' 和 'spring-ibatis.jar' 被合并到Spring 2.5大粒度的'spring-orm.jar'中。
◆Spring 2.5的 'spring-test.jar' 取代了'spring-mock.jar',表达其对test context framework的强烈关注。 注意 'spring-test.jar' 包含了上个版本 'spring-mock.jar'中的一切,因此如果是单元或集成测试,可以直接取代。
◆Spring 2.5的 'spring-tx.jar' 取代了 'spring-dao.jar' 和'spring-jca.jar' 文件,表达其对transaction framework的强烈关注。
◆Spring 2.5将其jar文件直接作为OSGi兼容的bundle。这使得在OSGi环境中使用Spring更加方便,不再需要定制打包了。

2.2 XML配置
Spring 2.0的XSD在描述Spring XML元数据格式方面比先前的DTD更丰富。 旧的DTD仍然得到支持,但如果可能我们鼓励在bean定义文件头部引用XSD文件。
有一点被改变了,那就是定义bean作用域的方式。如果你使用的是Spring 1.2 DTD,那么你能继续用'singleton'属性。如果你选择引用新的Spring 2.0 DTD,它不允许使用'singleton'属性,那么可以用'scope'属性来定义bean的生命周期作用域。

2.3 Deprecated(淘汰)的类和方法
一些以前被标记为@deprecated的类和方法Spring 2.0代码库中被完全删除了。 Spring团队决定把2.0版本作为一个新的开始,那些被deprecated的代码应该被除去而不是在可预见的未来继续在代码中出现。

2.4 下面的类/接口已经从Spring 2.0的代码中删除了:
  ResultReader : 使用RowMapper接口代替。
  BeanFactoryBootstrap : 考虑使用一个BeanFactoryLocator 或是自定义引导类代替

2.5 Apache OJB
Spring 2.0开始,请注意Spring主代码中的Apache OJB支持被完全删除了; 但仍然可以在Spring Modules项目中找到Apache OJB的集成库。

2.6 iBATIS
 请注意iBATIS SQL Maps 1.3支持被完全去除了。如果你还在使用iBATIS SQL Maps 1.3, 请升级到iBATIS SQL Maps 2.0/2.1。

2.7 Hibernate
  Spring 2.5中,对 Hibernate 2.1 和 Hibernate 3.0 的支持已经去除。请升级到Hibernate 3.1或更高版本。
  如果你需要继续使用Hibernate 2.1或3.0,我们建议你继续使用Spring 2.0.7/2.0.8,这些版本仍然支持Hibernate的那些版本。

2.8 JDO
  Spring 2.5中,对JDO 1.0 的支持被去除。请升级到JDO 2.0或更高版本。
  如果你需要继续使用JDO 1.0,我们建议你继续使用spring 2.0.7/2.0.8,这些版本仍然支持JDO 1.0。

2.9 UrlFilenameViewController
  从Spring 2.0起,UrlFilenameViewController所决定的view名字现在考虑了request中的嵌套路径。这是对原始 UrlFilenameViewController约定的重大修改,意味着如果你从Spring 1.x升级到Spring 2.x,并且你在使用这个类,你可能必须小小的修改你的Spring Web MVC配置。请参考UrlFilenameViewController 的类Javadoc,来查看新的view name determination的约定的示例。


大家在使用新版本之前请先注意这些改变,也许对您的系统来说,是很重要的。

3 spring3.0特性

一、首先,模块的组织更加的细致,从那么多的jar分包就看的出来:
Spring的构建系统以及依赖管理使用的是Apache Ivy,从源码包看出,也使用了Maven。
Maven确实是个好东西,好处不再多言,以后希望能进一步用好它。

二、新特性如下:

Spring Expression Language (Spring表达式语言)
IoC enhancements/Java based bean metadata (Ioc增强/基于Java的bean元数据)
General-purpose type conversion system and UI field formatting system (通用类型转换系统和UI字段格式化系统)
Object to XML mapping functionality (OXM) moved from Spring Web Services project (对象到XML映射功能从Spring Web Services项目移出)
Comprehensive REST support (广泛的REST支持)
@MVC additions (@MVC增强)
Declarative model validation (声明式模型验证)
Early support for Java EE 6 (提前对Java EE6提供支持)
Embedded database support (嵌入式数据库的支持)

三、针对Java 5的核心API升级

  1、BeanFactory接口尽可能返回明确的bean实例,例如:
     T getBean(String name, Class requiredType)
     Map getBeansOfType(Class type)
     Spring3对泛型的支持,又进了一步。个人建议泛型应该多用,有百利而无一害!
  2、Spring的TaskExecutor接口现在继承自java.util.concurrent.Executor:
     扩展的子接口AsyncTaskExecutor支持标准的具有返回结果Futures的Callables。
     任务计划,个人还是更喜欢Quartz。
  3、新的基于Java5的API和SPI转换器
     无状态的ConversionService 和 Converters
     取代标准的JDK PropertyEditors
     类型化的ApplicationListener,这是一个实现“观察者设计模式”使用的事件监听器。
     基于事件的编程模式,好处多多,在项目中应该考虑使用,基于事件、状态迁移的设计思路,有助于理清软件流程,和减少项目的耦合度。
四、Spring表达式语言
Spring表达式语言是一种从语法上和统一表达式语言(Unified EL)相类似的语言,但提供更多的重要功能。它可以在基于XML配置文件和基于注解的bean配置中使用,并作为基础为跨Spring portfolio平台使用表达式语言提供支持。
接下来,是一个表达式语言如何用于配置一个数据库安装中的属性的示例:
        value="#{systemProperties.databaseName}"/>
        value="#{strategyBean.databaseKeyGenerator}"/>
如果你更愿意使用注解来配置你的组件,那么这种功能同样可用:
@Repository public class RewardsTestDatabase {
      @Value("#{systemProperties.databaseName}")
      public void setDatabaseName(String dbName) { … }
    
      @Value("#{strategyBean.databaseKeyGenerator}")
      public voidsetKeyGenerator(KeyGenerator kg) { … }
}
又多一种表达式语言,造轮子的运动还在继续中!

五、基于Java的bean元数据
JavaConfig项目中的一些核心特性已经集成到了Spring中来,这意味着如下这些特性现在已经可用了:
@Configuration
@Bean
@DependsOn
@Primary
@Lazy
@Import
@Value
又来一堆的注解,无语了,感觉还是配置文件方便!:(
这儿有一个例子,关于一个Java类如何使用新的JavaConfig特性提供基础的配置信息:
package org.example.config;

@Configuration
public class AppConfig {
    private @Value("#{jdbcProperties.url}") String jdbcUrl;
    private @Value("#{jdbcProperties.username}") String username;
    private @Value("#{jdbcProperties.password}") String password;

    @Bean
    public FooService fooService() {
        return new FooServiceImpl(fooRepository());
    }

    @Bean
    public FooRepository fooRepository() {
        return new HibernateFooRepository(sessionFactory());
    }

    @Bean
    public SessionFactory sessionFactory() {
        // wire up a session factory
        AnnotationSessionFactoryBean asFactoryBean =
            new AnnotationSessionFactoryBean();
        asFactoryBean.setDataSource(dataSource());
        // additional config
        return asFactoryBean.getObject();
    }

    @Bean
    public DataSource dataSource() {
        return new DriverManagerDataSource(jdbcUrl, username, password);
    }
}
为了让这段代码开始生效,我们需要添加如下组件扫描入口到最小化的应用程序上下文配置文件中:

六、在组件中定义bean的元数据
  感觉Spring提供了越来越多的注解、元数据,复杂性已经超出了当初带来的方便本身!

七、通用类型转换系统和UI字段格式化系统
Spring3加入了一个通用的类型转换系统,目前它被SpEL用作类型转换,并且可能被一个Spring容器使用,用于当绑定bean的属性值的时候进行类型转换。
另外,还增加了一个UI字段格式化系统,它提供了更简单的使用并且更强大的功能以替代UI环境下的JavaBean的PropertyEditors,例如在SpringMVC中。
这个特性要好好研究下,通用类型转换系统如果果如所言的话,带来的好处还是很多的。

八、数据层
对象到XML的映射功能已经从Spring Web Services项目移到了Spring框架核心中。它位于org.springframework.oxm包中。
OXM?研究下!时间真不够!

九、Web层
在Web层最激动人心的新特性莫过于新增的对构件REST风格的web服务和web应用的支持!另外,还新增加了一些任何web应用都可以使用的新的注解。
服务端对于REST风格的支持,是通过扩展既有的注解驱动的MVC web框架实现的。
客户端的支持则是RestTemplate类提供的。
无论服务端还是客户端REST功能,都是使用HttpConverter来简化对HTTP请求和应答过程中的对象到表现层的转换过程。
MarshallingHttpMessageConverter使用了上面提到的“对象到XML的映射机制”。

十、@MVC增强
新增了诸如@CookieValue 和 @RequestHeaders这样的注解等。

十一、声明式模型验证
支持JSR 303,使用Hibernate Validator作为实现。

十二、提前对Java EE6提供支持
提供了使用@Async注解对于异步方法调用的支持(或者EJB 3.1里的 @Asynchronous)

另外,新增对JSR 303, JSF 2.0, JPA 2.0等的支持。

十三、嵌入式数据库的支持
对于嵌入式的Java数据库引擎提供了广泛而方便的支持,诸如HSQL, H2, 以及Derby等。
这是不是代表一种潮流呢?数据库向越来越小型化发展,甚至小型化到嵌入式了,我认为这在桌面级应用上还是很有市场的。

你可能感兴趣的:(spring2.0-2.5-3.0变化(整理))