2.5 新特性概述

下面列出的是 Spring 3.0 的新特性,我们在后面章节的详细讲述中会覆盖到这些特性。

  • Spring 表达式语言
  • IoC 增加/基于对 Java 的 bean 元数据的支持
  • 通用的类型转换和字段格式化系统
  • 对象转 XML 映射功能(OXM),这是从 Spring Web Service 项目中迁出的
  • 全面的 REST 支持
  • 增加@MVC
  • 声明式的模型验证
  • 先期对 Java EE 6 的支持
  • 嵌入式数据库的支持

2.5.1 为 Java 5 更新的核心 API

BeanFactory 接口尽可能地返回该类型 bean 的实例:

  • 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

  • 扩展的 AsyncTaskExecutor 支持标准的可调用特性

新的基于 Java 5 的转换 API 和 SPI:

  • 无状态的 ConversionService 和转换器
  • 取代标准 JDK 的 PropertyEditors

泛型 ApplicationListener<E>

2.5.2 Spring 表达式语言

Spring 引入了一种表达式语言,这和统一的 EL 在语法上很相似,但是提供了很多新特 性。这种表达式语言可以用于定义基于 XML 和注解的 bean,也可以作为表达式语言的基础, 支持贯穿整个 Spring 框架的组合。这些新功能的详细内容可以在第 7 章 Spring 表达式语言(SpEL)中看到。

Spring 表达式语言被用来为 Spring 社区提供一个单一的,支持良好的表达式语言,可以 用于 Spring 系列的所有产品中。它的语言特性由 Spring 系列产品的所有项目的需求来共同 驱动,包括基于 Eclipse 的 SpringSource Tool Suite(SpringSource 组织开发的工具套件,译者 注)代码完成支持工具的需求。

下面是表达式语言如何被用于配置数据库属性设置的示例代码:

<bean class="mycompany.RewardsTestDatabase">
    <property name="databaseName" value="#{systemProperties.databaseName}" />
    <property name="keyGenerator"
        value="#{strategyBean.databaseKeyGenerator}"/>
</bean>

如果你使用注解来配置组件,那么这个功能也是可用的:

@Repository
public class RewardsTestDatabase {
    @Value("#{systemProperties.databaseName}")
    public void setDatabaseName(String dbName) { … }
    @Value("#{strategyBean.databaseKeyGenerator}" )
    public void setKeyGenerator(KeyGenerator kg) { … }
}

2.5.3 控制反转(IoC)容器

2.5.3.1 基于 Java 的 bean 元数据

Java Config 项目中引入的一些核心特性现在也被加入到 Spring Framework 中了。这就 是说下面的注解是直接被支持的。

  • @Configuration
  • @Bean
  • @DependsOn
  • @Primary
  • @Lazy
  • @Import
  • @ImportResource
  • @Value

下面是一个 Java 类提供基本配置信息的示例,使用了新的 Java Config 特性:

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() {
        // 装配一个session factory
        AnnotationSessionFactoryBean asFactoryBean =
        new AnnotationSessionFactoryBean(); asFactoryBean.setDataSource(dataSource());
        // 其它配置
        return asFactoryBean.getObject();
    }
    @Bean
    public DataSource dataSource() {
        return new DriverManagerDataSource(jdbcUrl, username, password);
    }
}

要让它发挥作用,你需要在应用上下文的 XML 文件中添加如下的组件扫描项。

<context:component-scan base-package="org.example.config"/>
<util:properties id="jdbcProperties" location="classpath:org/example/config/jdbc.properties" />

或 者 你 可 以 直 接 使 用 AnnotationConfigApplicationContext 来 启 动 被 @Configuration 注解的类:

public static void main(String[] args) { 
    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig. class);
    FooService fooService = ctx.getBean(FooService.class); fooService.doStuff();
}

参考 4.12.2 节“使用 AnnotationConfigApplicationContext 实例化 Spring 容器”来参考关 于 AnnotationConfigApplicationContext 的全部内容。

2.5.3.2 使用组件定义 bean 的元数据

@Bean 注解的方法也可以支持内部的 Spring 组件。它们贡献工厂 bean 的定义到容器中。 参考 4.10.4 节“使用组件定义 bean 的元数据”来获取更多信息。

2.5.4 通用的类型转换系统和字段格式化系统

通用的类型转换系统(参考 6.5 节)已经引入了。系统现在被 SpEL 使用来进行类型转 换,当绑定 bean 的属性值时也会被 Spring 容器和数据绑定器使用。

此外,格式化(参考 6.6 节)SPI 也被引入了,来格式化字段值。这个 SPI 对 JavaBean 的 PropertyEditors 提供了简单的,更强壮替代,在如 Spring MVC 的客户端环境中来使用。

2.5.5 数据层

现在,对象到 XML 映射功能(OXM)被从 Spring Web Service 项目中移到 Spring Framework 的核心中。这个功能可以在 org.springframework.oxm 包下找到。关于使用 OXM 模块 的更多信息可以在第 15 章使用 O/X 映射器编组 XML 找到。

2.5.6 Web 层

对于 Web 层来说,最令人兴奋的新特性是对构建 RESTful Web Service 和 Web 应用程序 的支持。也有一些新的注解可以用于任意的 Web 应用程序。

2.5.6.1 全面的 REST 支持

对构建 RESTful 应用程序服务器端的支持已经作为已有的注解驱动的 MVC web 框架而提 供了。客户端的支持由 RestTemplate 类来提供,和其 它的模板类是相 似的,比如 JdbcTemplate 和 JmsTemplate。服务器和客户端两者的 REST 功能都使用 HttpConverter 来在对象和它们在 HTTP 请求和响应代表之间方便的转换。

MarshallingHttpMessageConverter 使用之前提到的对象到 XML 映射功能。 可以参考 MVC(第 16 章)和 RestTemplate(20.9.1 节)部分获取更多信息。

2.5.6.2 @MVC 的增加

mvc 命名空间被引入来大大简化 Spring MVC 的配置。

其它如 @CookieValue 和 @RequestHeader 的 注 解 也 被 加 入 了 。 参 考 使 用

@CookieVlue 注解映射 cookie 值(16.3.3.9 节)和使用@RequestHeader 注解映射请求头部属 性(16.3.3.10 节)来获取更多信息。

2.5.7 声明式的模型验证

一些验证增强(6.7 节),包括 JSR303 支持,使用 Hibernate 校验器作为默认提供者。

2.5.8 先期对 Java EE 6 的支持

通过使用新的@Async 注解(或 EJB 3.1 的@Asynchronous 注解)我们提供异步方法调用。

JSR 303,JSF 2.0,JPA 2.0 等

2.5.9 嵌入式数据库的支持

现在也提供了对嵌入式 Java 数据库引擎(13.8 节)的方便支持,包括 HSQL,H2 和 Derby。