本文重点介绍 Spring 3.1 M2 中 Spring MVC 的新功能。以下是主题:
- MVC 命名空间的基于代码的等效项。
- 可定制的 @MVC 处理。
- 编程模型改进。
在此简要提醒一下,这里讨论的功能正在 Greenhouse 项目中实际应用。
Spring MVC 的基于代码的配置
正如 Chris 在上周五他的博客文章中指出的那样,XML 命名空间极大地减少了配置,但同时也降低了透明度和有时损失了灵活性。对于 MVC 命名空间来说也是如此,它支持许多定制,但并非所有可用的功能都支持。这意味着你要么使用它,要么放弃它。我们认为基于代码的配置对此有解决方案,并且提供了一条从简单到高级的路径。
让我们从这个简单、熟悉的片段开始:
<mvc:annotation-driven />
虽然对于使用注解控制器不是必需的,但 <mvc:annotation-driven>
执行了许多有用的操作——它检测 JSR-303(Bean Validation)实现的存在并使用它配置数据绑定,如果 Jackson JSON 库可用则添加 JSON 消息转换器,以及其他一些可以节省大量配置的操作。
现在让我们用基于代码的配置来匹配它:
@Configuration
@EnableWebMvc
public class WebConfig {
}
这里 @EnableWebMvc
导入一个 @Configuration
类,它与 <mvc:annotation-driven>
的功能相匹配。就这么简单。
下一步是在 <mvc:annotation-driven>
中使用属性,也许提供一个 FormattingConversionService
,或者添加一个子元素来配置消息转换器,或者使用其他 MVC 命名空间元素,如 <mvc:interceptors>
、<mvc:resources>
等。
让我们看看如何在基于代码的配置中完成所有这些操作:
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addFormatters(FormatterRegistry registry) {
// register converters and formatters...
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// add message converters...
}
@Override
public void configureInterceptors(InterceptorConfigurer configurer) {
configurer.addInterceptor(new…