🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 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。