第二部分 Spring3.0新特性
2.Spring3.0中的新功能和增强
如果你一直在使用spring,你会知道,spring经历了两个重要版本:2006年10月的Spring2.0和2007年11月的Spring2.5。现在,Spring3.0是第三个重要的版本。
(Java SE 和 Java EE的支持:Spring框架现在全面支持Java 5和Java 6。此外,Spring兼容J2EE 1.4和Java EE 6,同时,对Java EE6 有一些简单的支持)。
2.1 Java 5
整个框架针对Java 5的特点如泛型、变长参数等进行了全面的修改。我们竭尽所能任然保存代码向前兼容。在Spring AOP 的接口上,兼容原有的泛型集合、Map、FactoryBeans以及桥方法的解决方案。通用的应用程序监听自动鉴定指定类型的事件。现在,所有的回调接口如TransactionCallback 和 HibernateCallback 都定义了一个通用的结果。总之,Spring代码库针对Java 5做了最新的改进和优化。
Spring的TaskExecutor 被更新与Java 5的java.util.concurrent 整合。现在这些支持都像ExecutorService adapters和ThreadFactory等整合一样以一级类的方式提供。着使得遵循JSR-236标准成为可能。此外我们添加了新标签@Async用于异步方法调用。
2.2 文档的改进
Spring的文档也对Spring3.0中的这些新特性和改进做了更新。我们尽全力保证文档中没有错误,但错误在所难免。如果你发现了一些问题或者错误,请将错误描述发给Spring团队。
2.3 新文档和教程
我们有很多非常优秀的文档和教程教你如何使用Spring3的各种功能。它们都在Spring 文档页面里。
范例针对Spring3的新特性修改更新过。此外,范例也从原代码中移出到专门的SVN目录,目录是:
https://anonsvn.springframework.org/svn/spring-samples/
同样的,范例不再与Spring3一起打包,需要单独下载。然而,这个文档将继续引用一些范例(特别像Petclinic)用于说明功能。
注意SubVersion或者简称SVN上有更多信息,参阅项目首页http://subversion.apache.org/
2.4 新模块组织和系统构建
框架中的模块被修改并且每个模块源码数独立进行管理
org.springframework.aop
org.springframework.beans
org.springframework.context
org.springframework.context.support
org.springframework.expression
org.springframework.instrument
org.springframework.jdbc
org.springframework.jms
org.springframework.orm
org.springframework.oxm
org.springframework.test
org.springframework.transaction
org.springframework.web
org.springframework.web.portlet
org.springframework.web.servlet
org.springframework.web.struts
就像你知道的从Spring Web Flow2.0开始,我们使用新的Spring构建系统,这个系统涉及了:
Ivy-based "Spring Build" system
consistent deployment procedure
consistent dependency management
consistent generation of OSGi manifests
2.5 新特性预览
这里对Spring3.0做一个新特性的列表,关于特性更多的说明,会在后面章节里出现。
。Spring表达式语言
。IoC增强/基于Java的bean元数据
。多用途类型转换系统和成员格式化系统。
。从Spring Web Services项目拿来的对象到XML映射功能(OXM)。
。广泛的REST支持
。@MVC 标记
。声明模型验证
。Java EE 6的早期支持
。支持嵌入式数据库
2.5.1 针对Java 5 的核心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:
。子接口AsyncTaskExecutor支持标准调用接口
新的基于Java 5的从API向SPI的转换
。无状态的转换服务和转换器
。取代标准的JDK属性编辑器
类型化的ApplicationListener<E>
2.5.2 Spring描述语言
Spring提供一种类似Unified EL的表达式语言,这种语言功能比Unified EL要多很多。表达式语句能够定义XML和基于注释的bean定义时使用,他服务于整个Spring功能,包括基于Eclipse的Spring Source Tool Suite的代码补齐需求。
下面是使用表达式语言完成数据库属性设置的
<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的元数据
JavaConfig项目的一些特性现在被加入到Spring 框架里。这意味着,下面的这些注释是直接支持的:
@Configuration
@Bean
@DependsOn
@Primary
@Lazy
@Import
@ImportResource
@Value
这里有一个使用新特性为java类提供基础配置的例子:
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() {
// wire up a session factory
AnnotationSessionFactoryBean asFactoryBean =
new AnnotationSessionFactoryBean();
asFactoryBean.setDataSource(dataSource());
// additional config
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"/>
或者,你可以将@Configuration标签直接使用在AnnotationConfigApplicationContext类上,如下:
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
FooService fooService = ctx.getBean(FooService.class);
fooService.doStuff();
}
章节3.11.2“使用AnnotationConfigApplicationContext安装Spring容器”对于AnnotationConfigApplicationContext有更全面的描述。
2.5.3.2 在组件内定义bean元数据
Spring 组件支持方法使用@Bean 注释。它们通过一个工厂bean定义到容器。见章节“在组件内定义bean元数据”查看更多信息。
2.5.4 通用类型转换系统和字段格式化系统
通用类型转换系统引入了Spring3.0中。系统通过SpEL进行类型转换,也可以在spring容器和DataBinder的bean属性绑定时使用。
另外,使用格式化SPI格式化字段值引入了Spring3.0中。SPI提供了一个在客户端环境(比如:SpringMVC)比JavaBean属性编辑器更简单的鲁棒的替代。
2.5.5 数据层
对象到XML映射功能(OXM)从Spring Web Services项目移到了Spring核心框架。功能在org.springframework.oxm包中。更多的信息在“使用O/X映射器编辑XML”章节的oxm模块部分有更加详细的介绍。
2.5.6 Web层
支持构建RESTful web service和web应用是一个很令人激动的功能。在web应用中也提供了一些新注释供使用。
2.5.6.1 全面的REST支持
服务器端支持构建RESTful应用作为已存在的注释驱动的MVC web框架的扩展而支持的。客户端支持通过RestTemplate想其他模板一样支持(如JdbcTemplate、JmsTemplate)。客户端和服务器的REST功能都使用HttpConverter在对象与HTTP请求和相应之间进行转换。
在早期使用MarshallingHttpMessageConverter 进行对象到XML映射的功能。
参见MVC和RestTemplate章节。
2.5.6.2 @MVC 标记扩展
mvc命名空间引入了一个非常简单的Spring MVC配置
增加了附加的标记 @CookieValue 和 @RequestHeaders。参见“使用 @CookieValue 映射Cookie值”和“使用 @RequestHeaders 映射请求头属性”章节获取更多信息。
2.5.7 定义模型验证
在验证方面有一些增强,包括JSR303的支持使用Hibernate验证作为缺省验证。
2.5.8 早期的Java EE 6支持
支持通过新的 @Async 标记(或者EJB3.1的 @Asynchronous 标记)声明异步方法。
JSR303,JSF2.0,JPA2.0等等。
2.5.9 支持嵌入式数据库
方便的支持了嵌入式Java数据库引擎,包括HSQL,H2和Derby都提供支持。