<mvc:annotation-driven>做什么?</mvc:annotation-driven>

时间:2011-11-17 05:17:42

标签: spring-mvc

我在REST API中使用文件名(例如:GET http://xxx/api/myImage.jpg) 问题是@PathVariable掉了“.jpg”。 这个问题已经在这里问过几次并回答了。但对我不起作用。

所以我搜索了

然后找到了

https://jira.springsource.org/browse/SPR-6524

“......根本不应该与手动DefaultAnnotationHandlerMapping实例结合使用;这被设计为目前的一种或两种选择,非常类似于和。”

“mvc名称空间是简化配置”。

真正的问题是mvc做了什么?并改变了?

我发现了自己的这些东西..

  1. intercepter配置已更改。 (bean配置中需要mvc namspace)
  2. useDefaultSuffixPattern无效。
  3. 添加了JSON消息转换器。如果杰克逊图书馆可用
  4. @PathVariable参数自动添加到模型
  5. 还有其他人吗?

    提前致谢!

4 个答案:

答案 0 :(得分:12)

mvc:annotationDriven标记实际上为您设置了Spring上下文,以允许将请求分派给控制器。

标记将配置两个bean DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。

您可以从spring文档中找到更多信息:

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html

答案 1 :(得分:7)

要启用MVC Java配置,请将 @EnableWebMvc 注释添加到 @Configuration 类之一:

@Configuration
@EnableWebMvc
public class WebConfig {

}

在XML中实现相同的使用 的 MVC:注解驱动  DispatcherServlet上下文中的元素(如果没有定义DispatcherServlet上下文,则在根上下文中):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <mvc:annotation-driven/>
</beans>

上面注册了一个 RequestMappingHandlerMapping ,一个 RequestMappingHandlerAdapter 和一个 ExceptionHandlerExceptionResolver (以及其他),以支持使用带注释的控制器方法处理请求注释,例如 @RequestMapping,@ ExceptionHandler 等。

有关详细信息,请参阅以下链接:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-config

答案 2 :(得分:7)

在我提供某些要点之前让我清楚一下Roy提供的答案并不准确。您不必提供mvc:annotation-driven标记来实例化默认bean。可以使用此标记Spring 3.0+启用从Spring 3.0引入的新功能

如果您想要向后兼容,请不要使用它,特别是如果您使用的是基于控制器的旧类,如MultiActionControllerSimpleFormController

现在让我们来看看这个标签实际上做了什么 -

在Spring 3.1之前使用默认bean

  1. DefaultAnnotationHandlerMapping
  2. AnnotationMethodHandlerAdapter上
  3. AnnotationMethodHandlerExceptionResolver
  4. 在Spring 3.1中不推荐使用它们,如果使用上面提到的标记,它将被 -

    替换
    1. RequestMappingHandlerMapping
    2. RequestMappingHandlerAdapter
    3. ExceptionHandlerExceptionResolver
    4.   

      DefaultAnnotationHandlerMapping决定使用哪个控制器,AnnotationMethodHandlerAdapter选择处理请求的实际方法。 RequestMappingHandlerMapping执行这两项任务。因此,请求直接映射到方法。

      还有其他基础架构bean通过这些标记进行实例化(除了默认值链接),例如 - MappedInterceptorConfigurableWebBindingInitializerSessionFlashManager,{{ 1}}等我不打算解释这些:)因为它们每个都是很长的答案,所以谷歌它的更多信息。

      PS:是的,Spring 3.1+会自动将@PathVariables暴露给模型。你还有ContentNegociationManager标签。但我认为这与mvc:interceptors无关。我强烈推荐阅读 - http://spring.io/blog/2009/12/21/mvc-simplifications-in-spring-3-0/

答案 3 :(得分:0)

mvc:annotation-driven标签从context:component-scan tag

做额外的工作

标记会注册将请求发送到@Controllers所需的处理程序映射处理程序适配器

标签有助于注册以下组件。

DefaultAnnotationHandlerMapping - 这是一个HandlerMapping实现,它将HTTP请求映射到使用@RequestMapping批注定义的处理程序方法。

AnnotationMethodHandlerAdapter - 负责扫描控制器以识别使用@MVC注释注释的方法(和参数)。它扫描并缓存使用@RequestMapping注释的处理程序方法。还处理@RequestParam,@ ModelAttribute,@ SessionAttributes和@InitBinder注释。

ConfigurableWebBindingInitializer - Web数据绑定器的初始化程序。帮助声明性地使用验证器,转换服务,属性编辑器等配置Web Binder。

LocalValidatorFactoryBean - 实现验证器接口并启用JSR303验证。这将注入ConfigurableWebBindingInitializer。 FormattingConversionServiceFactoryBean - 一个转换工厂,它返回日期和数字等基本对象的转换服务。这个工厂再次注入ConfigurableWebBindingInitializer。

邮件转换器
ByteArrayHttpMessageConverter - 一个HTTP请求消息转换器,它读取HTTP消息体并返回字节流。它还可以读取字节流并构造响应主体。用于接收和发送PDF,XLS等文件。
StringHttpMessageConverter - 一个HTTP请求消息转换器,它读取纯文本请求正文并将其绑定到String对象。反之亦然 FormHttpMessageConverter - 一个HTTP请求消息转换器,它读取表单编码的请求正文并将其绑定到表单绑定对象。
SourceHttpMessageConverter - 一个HTTP请求转换器,用于将XML消息体转换为绑定对象或从绑定对象转换。

如果我们不使用mvc:annotation-driven标签,那么我们必须在xml文件中手动注册这些组件才能使用它们,这会导致额外的工作量过多。