Spring对@Controller的支持由 与


问题内容

我一直在研究使用mvc:annotation-driven标签时我们具有的其他功能,并且在消化结果方面遇到了困难,尤其是在@Controller注释方面。我知道这与这个问题非常相似,但请听我说。

根据Spring文档

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

然后,文档继续显示context:component-scan标记提供了这种支持。一切都很好,但是后来我看了mvc:annotation-
driven给我们带来了什么,前面提到的问题提供了以下答案

mvc:annotation-driven声明显式支持注释驱动的MVC控制器(即@ RequestMapping,@
Controller,尽管默认行为是对它们的支持),以及通过@Valid和消息主体与@RequestBody编组来添加对分解验证的支持/
ResponseBody。

对我来说,这似乎是多余的。也许我没有得到这种明确的支持。再次,参考官方的Spring
文档,我们得到以下内容

[mvc:annotation-driven]注册了Spring
MVC分发请求到@Controllers所需的DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter
Bean。

这听起来与我从文档中提供的最后一个示例非常相似。如果任何人都可以仅使用context:component-
scan标签提供一些示例,说明我们可以使用@Controller注释执行哪些操作,则有哪些局限性,则可以添加添加mvc:annotation-
driven时获得的附加功能标签,我认为这将非常有帮助。预先感谢您对此的任何支持。


问题答案:

这两个元素的目的完全不同。

<context:component-scan />顾名思义,它用于组件扫描。它通过为与所有豆类默认扫描@Component注释(或类似的“亚健康”的注解@Controller@Service等等)。它将仅在应用程序上下文中将这些类的实例注册为bean。就这些。

<mvc:annotation-driven />用于引导Spring MVC,并且除其他外,它注册a
RequestMappingHandlerMappingRequestMappingHandlerAdapter。第一个将请求链接到某个方法(@RequestMapping@Controller注释的类中方法的注释)。最后一个知道如何执行带有注释的方法@RequestMaping

现在<mvc:annotation-driven />不执行任何扫描或检测@Controllers应用程序上下文中是否没有内容的操作,因此不进行任何请求映射。现在,您有几种在应用程序上下文中注册这些bean的方法,其中一种是上述方法<context:component- scan />

基本上@Controller没有<mvc:annotation-driven />,没错,是没什么用,因为它不只是占用内存。它不会绑定到传入的请求,而只是在应用程序上下文中徘徊。它只是所有其他bean一样的另一个bean,并没有对其进行任何特殊处理。(最近但已弃用的Spring版本会注册DefaultAnnotationHandlerMapping处理的@Controller,但已弃用)。