欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring 3.0的新功能

程序员文章站 2022-03-02 10:13:30
...
    2009年9月发布Spring 3.0第一个候选版本,2009年12月正式发布了Spring 3.0版本,在本书撰写时(2011年1月)的最新版本是Spring 3.0.5。比之于Spring 2.x,有众多新功能被添加到Spring中:它基于Java 5.0语言特性,提供了EL(Expression Language,表达式语言)和REST的支持,同时还支持JSR-330(依赖注入)和JSR-303(Bean 验证)的规范。在进入Spring具体内容的学习之前,有必要了解一下这些新功能。由于有些新功能可能是在Spring 3.0添加的,也有可能是在Spring 3.0.x等版本添加的,为了叙述方便,在一般情况下,我们统一称之为Spring 3.0。

核心API更新到Java 5.0

   在Spring 2.x中,其实我们已经可以看到这个趋势。当时Spring已经有很多类采用Java 5.0的语言特点,不过它们被谨慎地放到一个单独的tiger包中。鉴于当前基本上所有的Java应用都已采用Java 5.0开发,Spring 3.0顺应大势也将其核心API都更新到Java 5.0上,方便开发者的调用。
   这个更新的最大标志是将核心API采用泛型和不定入参的特性。如BeanFactory的部分方法签名已经调整成如下形式:
  • T getBean(Class<T> requiredType)
  • T getBean(String name, Class<T> requiredType)
  • Map<String, T> getBeansOfType(Class<T> type)

   此外,Spring让TaskExecutor直接扩展java.util.concurrent.Executor的接口,在Spring 2.x中TaskExecutor则是一个独立的接口。AsyncTaskExecutor扩展于TaskExecutor,支持在一段时间后异步调用某个方法。
新增了一个用于类型转换的ConversionService接口,它是Spring 3.0新增类型转换系统的核心接口,其提供的方法都支持泛型。Spring 3.0使用类型转换系统替换掉原来标准JDK的JDK PropertyEditors。
   最后,Spring的事件监听器也支持泛型,形如ApplicationListener<E extends ApplicationEvent>。这样,只要指定事件的类型就可以监听某一类型的事件了。

Spring表达式语言
    在低版本时,很多Spring开发者迫切希望Spring添加的一个功能就是脚本化配置的能力。这个梦想在Spring 3.0中终于得到了实现。Spring提供的脚本称为SpEL,它和统一EL(Express Language)类似,但提供了更为强大的功能,如可以在Spring的XML配置文件或Spring配置的注解中使用。
    这是一个很强大的功能,可以在Bean配置时和Java实例化对象进行交互,获取动态的特性。如你可以使用执行某个Bean的方法,让方法的返回值作为另一个Bean属性的值。
通过基于Eclipse的SpringSource Tool Suite,在IDE环境中可以获取表达式语言诱导的功能。更多关于SpEL的功能,我们将在第4章中讲解。来看一个使用SpEL的配置文件:

<bean id="bean1" class="com.baobaotao.Bean1">
<bean class="com.baobaotao.Bean2">
  <property name="userName" value="#{bean1.userName}"/> 
  <property name="password" value="#{bean1.password}"/>
</bean> 


   以上配置块中以#{} 表示的部分就是使用了SpEL表达式的配置,它将调用bean1的相应方法为Bean2注入值。

可通过Java类提供IoC配置信息

   Spring拥有众多的子项目,Spring在升级时经常将那些成熟且广受欢迎的子项目整合到Spring主项目中。Spring JavaConfig是一个通过Java类提供Spring配置元信息的子项目,Spring 3.0已经将其纳入到Spring框架的核心模块中。
   在早期版本中,Spring仅提供XML配置方式,在Spring 2.5中提供了基于注解的配置方式,在Spring 3.0中则提供了基于Java类的配置方式。这三种配置方式无非是形式上的区别,最终提供的都是Spring配置的元数据。Spring要提供这么多配置方式,并不是要用一种方式替换另一种方式,它们在不同的应用场景下将表现出各自的优势。所以你可能会同时使用到这三种方式。
   下面是使用Java类进行配置的例子,它直接来自于Spring的开发指南。
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() {
        AnnotationSessionFactoryBean asFactoryBean =
                new AnnotationSessionFactoryBean();
        asFactoryBean.setDataSource(dataSource());
        return asFactoryBean.getObject();
    }

    @Bean
    public DataSource dataSource() {
        return new DriverManagerDataSource(jdbcUrl, username, password);
    }
}

    这个Java类通过Spring特定的注解,提供了配置的元数据信息,定义了Bean。它和XML或注解的配置方式相比,最大的优势是灵活!使用了@Bean的方法返回一个Bean,你可以通过代码决定要如何实例化这个Bean,而不像在XML中那样只能指定一个类名。

通用类型转换系统和属性格式化系统

   引入了一种通用的“类型转换系统”,Spring的SpEL目前使用该系统进行类型转换,也可以在Spring容器及DataBinder的Bean属性绑定时使用。在格式化Bean属性值时,引入了一套格式化的SPI接口,它比早期使用的JavaBean PropertyEditors更为强大易用。

数据访问层新增OXM功能

   来自于Spring Web Service项目的OXM(Object to XML,对象XML映射)已经被移到Spring的核心框架中,OXM类似于我们熟悉的ORM,它通过元数据描述对象和XML转换的映射。它对应的包是org.springframework.oxm。

Web层的增强

   Spring 3.0最令人振奋的一个增强是Spring MVC提供了对REST风格编程的支持。在服务端提供了一些易用的REST注解,在调用端则提供了RestTemplate模板类,服务端和调用端都通过HttpConverter进行对象和HTTP请求/响应的转换。
   我们知道在Spring 2.5中引入了一套Spring MVC的注解,如@Controller,@Request Mapping等,Spring 3.0继续完善这一注解体系,新增了@CookieValue、@RequestHeaders的注解,可以直接绑定Cookie及请求报文头的数据。


其他

  • 声明式模型验证:Sping 3.0对模型校验进行了很多的增强。首先,它全面支持JSR-303的Bean验证API;其次,可以使用Spring的DataBinder对Bean进行校验;最后,Spring MVC支持声明式验证。
  • 对JavaEE 6的支持:Spring 3.0可以使用@Async或EJB3.1的@Asynchronous注解异步地调用某个方法。此外,还支持JSR-303、JSF 2.0及JPA 2.0中的大部分功能。
  • 支持内嵌的数据库:提供便捷的方法支持内嵌数据库引擎,如HSQL、H2和Berby。

相关标签: spring