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

时间:2013-12-12 18:21:23

标签: java spring spring-mvc

我一直在研究使用mvc:annotation-driven标签时我们有哪些额外的功能,我很难消化结果,特别是在@Controller注释方面。我知道这与this question非常相似,但请听我说。

根据Spring docs

  

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

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

  

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

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

  

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

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

3 个答案:

答案 0 :(得分:17)

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

顾名思义,

<context:component-scan />用于组件扫描。默认情况下,它会扫描具有@Component注释的所有bean(或@Controller@Service等“子”注释。它只会将应用程序上下文中这些类的实例注册为bean。就是这样。

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

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

基本上没有@Controller的{​​{1}}是非常没用的,因为它只会占用内存。它不会绑定到传入的请求,它只是在应用程序上下文中挂起。它只是像所有其他bean一样的另一个bean,并没有做任何特别的事情。 (最近但已弃用的Spring版本注册了处理<mvc:annotation-driven />的{​​{1}},但这已被弃用。

答案 1 :(得分: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属性中即可。< / p>

答案 2 :(得分:0)

  • 案例1(注释驱动)

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

  • 案例2(组件扫描)

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