这篇博文重点介绍 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…