首页 文章

由<context:component-scan /> vs <mvc:annotation-driven>给出的@Controller的Spring支持

提问于
浏览
9

我很难消化结果,特别是在@Controller注释方面 . 我知道这与_2617206非常相似,但请听我说 .

根据Spring docs

@Controller注释的基本目的是充当带注释的类的构造型,指示其角色 . 调度程序将扫描这些带注释的类以查找映射方法,检测@RequestMapping注释(请参阅下一节) .

然后,文档继续显示上下文:component-scan标记提供此支持 . 所以这一切都很好,但后来我看着mvc:annotation-driven给了我们什么,前面提到的stackoverflow question提供了以下答案

mvc:annotation-driven声明显式支持注释驱动的MVC控制器(即@RequestMapping,@ Controller,虽然支持这些是默认行为),以及通过@Valid添加对declrative验证的支持,并使用@添加消息体编组RequestBody / ResponseBody .

这对我来说似乎有点多余 . 也许我得不到这种明确的支持 . 再次,回顾官方的 Spring 天documentation,我们得到以下内容

[mvc:annotation-driven]注册Spring MVC将请求分派给@Controllers所需的DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter bean .

这听起来与我从文档中提供的最后一个例子非常相似 . 如果任何人都可以提供一些关于我们如何使用@Controller注释只使用上下文:component-scan标签,一些限制是什么,那么我们在添加mvc:annotation-driven时获得的附加功能的示例标签,我认为这将非常有帮助 . 在此先感谢任何支持 .

3 回答

  • 17

    这两个元素的用途完全不同 .

    顾名思义, <context:component-scan /> 用于组件扫描 . 它默认使用 @Component 注释(或 @Controller@Service 等"sub"注释)扫描所有bean . 它只会将应用程序上下文中这些类的实例注册为bean . 就这些 .

    <mvc:annotation-driven /> 用于引导Spring MVC,它注册了 RequestMappingHandlerMappingRequestMappingHandlerAdapter . 第一个链接请求到某个方法( @RequestMapping 注释类在 @Controller 注释类中) . 最后一个知道如何执行用 @RequestMaping 注释的方法 .

    现在 <mvc:annotation-driven /> 对于扫描或检测 @Controllers 没有任何作用,如果应用程序上下文中没有,则不会进行任何请求映射 . 现在,您可以通过多种方式在应用程序上下文中注册这些bean,其中之一就是前面提到的 <context:component-scan /> .

    基本上没有 <mvc:annotation-driven /> 是没有 <mvc:annotation-driven /> ,因为它除了占用内存之外什么都不做,所以没用 . 它不会绑定到传入的请求,它只是在应用程序上下文中挂起 . 它只是像所有其他bean一样的另一个bean,并没有做任何特别的事情 . (最近但不推荐使用的Spring版本注册了 DefaultAnnotationHandlerMapping ,它处理了 @Controller ,但这已被弃用) .

  • 9

    context:component-scan 元素列出了Spring应该扫描@Controller注释的包(在 base-package 属性中) .

    mvc:annotation-driven 没有这样的属性 . 这是一个便利元素,它将许多默认MVC元素安装到应用程序上下文中 . 这些元素列于Spring framework reference的第16.14.1节中 . 此元素似乎不扫描@Controller注释 .

    与普遍看法相反,这些元素之间没有依赖关系 . 没有 mvc:annotation-driven 的@Controller将正常运行并处理HTTP请求就好了,只要您已将 context:component-scan 包含在适当的 base-package 属性中即可 .

  • 0
    • 案例1(注释驱动)

    这是启用Spring注释标记 . 可以使用所有注释,例如 @Controller, @Service, @Autowired 等 . 这不会创建一个bean,但会找到注释,如果找到注释(例如 @Controller, @Service, @Autowired 等等),spring会为该类创建相应的bean .

    • 案例2(组件扫描)

    Spring将扫描声明中指定的类的包(和子包)并为其创建bean .

相关问题