## 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](http://www.springsource.org/javaconfig) 項目中引入的一些核心特性現在也被加入到 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。
- 第一部分 Spring framework 概述
- 第 1 章 Spring Framework 介紹
- 1.1 依賴注入和控制反轉
- 1.2 模塊
- 1.3 使用方案
- 第二部分 Spring 3 的新特性
- 第 2 章 Spring 3.0 的新特性和增強
- 2.1 Java 5
- 2.2 改進的文檔
- 2.3 新的文章和教程
- 2.4 新的模塊組織方式和系統構建方式
- 2.5 新特性概述
- 第 3 章 Spring 3.1 的新特性和增強
- 3.1 新特性概述
- 第三部分 核心技術
- 第 4 章 IoC 容器
- 4.1 Spring IoC 容器和 bean 的介紹
- 4.2 容器概述
- 4.3 Bean 概述
- 4.4 依賴
- 4.5 Bean 的范圍
- 4.6 自定義 bean 的性質
- 4.7 Bean 定義的繼承
- 4.8 容器擴展點
- 4.9 基于注解的容器配置
- 4.10 類路徑掃描和管理的組件
- 4.11 使用 JSR 330 標準注解
- 4.12 基于 Java 的容器配置