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。