【问题标题】:What's the difference between <mvc:annotation-driven /> and <context:annotation-config /> in servlet?servlet 中的 <mvc:annotation-driven /> 和 <context:annotation-config /> 有什么区别?
【发布时间】:2011-04-28 00:54:30
【问题描述】:

我正在从 Spring 2.5 迁移到 Spring 3。

他们介绍了&lt;mvc:annotation-driven /&gt;,它具有一些黑魔法。这应该只在 servlet 配置文件中声明。

在 Spring 2.5 中,我刚刚使用了在 application-context.xml 和调度程序 servlet 配置 XML 中声明的 &lt;context:annotation-config /&gt;&lt;context:component-scan base='...'/&gt; 标记以及要扫描的适当基础包。

所以我想知道 servlet 配置中的 mvc:annotation-drivencontext:annotation-config 标记有什么区别,我可以在 Spring 3 配置文件中消除什么?

【问题讨论】:

    标签: spring spring-mvc spring-3


    【解决方案1】:

    &lt;context:annotation-config&gt; 声明支持一般注解,例如@Required@Autowired@PostConstruct 等。

    &lt;mvc:annotation-driven /&gt; 声明了对注释驱动的 MVC 控制器的显式支持(即 @RequestMapping@Controller,尽管对这些控制器的支持是默认行为),并通过 @Valid 和消息正文添加了对声明式验证的支持与@RequestBody/ResponseBody 编组。

    【讨论】:

    • 我是否应该在 applicationContext 和 servlet 中声明 context:annotation-config,尤其是当我在组件扫描标签中使用不同的基础包时?
    • 是的,在每种情况下您都需要&lt;context:annotation-config&gt;
    • @skaffman:&lt;mvc:annotation-driven&gt; 并非毫无意义,只是名称不正确。实际上它配置了对 Spring MVC 新特性的支持,例如使用 @Valid 的声明式验证、使用 @RequestBody/@ResponseBody 的 HTTP 消息转换、新的字段转换架构等。
    • @Richards:通常是的,见blog.springsource.com/2009/12/21/…
    • 这个答案是完全错误的,因为 mvc:annotation-driven 对于转换和验证至关重要。这里唯一正确和有价值的是来自@axtavt 的评论。
    【解决方案2】:

    Spring docs 中还有一些关于&lt;mvc:annotation-driven /&gt; 使用的更多细节。简而言之,&lt;mvc:annotation-driven /&gt; 让您可以更好地控制 Spring MVC 的内部工作。除非您需要文档上述部分中概述的一项或多项功能,否则您无需使用它。

    此外,还有其他“注释驱动”标签可用于在其他 Spring 模块中提供附加功能。例如&lt;transaction:annotation-driven /&gt; 启用@Transaction 注解,&lt;task:annotation-driven /&gt; 是@Scheduled 等所必需的...

    【讨论】:

    • 我想在 xml 中看到一组与这个标签类似的设置。很久以前我曾经遇到过这个例子,但它不完整,AFAIR。
    【解决方案3】:

    mvc:annotation-driven 是 Spring 3.0 中添加的标签,它执行以下操作:

    1. 配置 Spring 3 Type ConversionService(PropertyEditors 的替代品)
    2. 添加了对使用@NumberFormat 格式化数字字段的支持
    3. 如果 Joda Time 在类路径中,则添加对使用 @DateTimeFormat 格式化日期、日历和 Joda Time 字段的支持
    4. 如果 JSR-303 Provider 在类路径中,则添加对使用 @Valid 验证 @Controller 输入的支持
    5. 如果 JAXB 在类路径上,则添加对读取和写入 XML 的支持(使用 @RequestBody/@ResponseBody 进行 HTTP 消息转换)
    6. 如果 Jackson 在类路径上,则添加对读取和写入 JSON 的支持(与 #5 相同)

    context:annotation-config 在定义的同一应用程序上下文中查找 bean 上的注释,并声明支持所有通用注释,如 @Autowired、@Resource、@Required、@PostConstruct 等。

    【讨论】:

    • 关于 mvc:annotation-driver - spring.io/blog/2009/12/21/mvc-simplifications-in-spring-3-0 的源代码和更多详细信息
    • 所以你的意思是,如果我需要 @Autowired, @Resource, @Required, @PostConstruct@RequestBody, @ResponseBody - 所有这些注释,那么我将不得不在我的配置中添加这两个 mvc:annotation-driven context:annotation-config 标签?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2015-05-05
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多