我一直在研究使用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。就这些。
<context:component-scan />
@Component
@Controller
@Service
<mvc:annotation-driven />用于引导Spring MVC,并且除其他外,它注册a RequestMappingHandlerMapping和RequestMappingHandlerAdapter。第一个将请求链接到某个方法(@RequestMapping带@Controller注释的类中方法的注释)。最后一个知道如何执行带有注释的方法@RequestMaping。
<mvc:annotation-driven />
RequestMappingHandlerMapping
RequestMappingHandlerAdapter
@RequestMapping
@RequestMaping
现在<mvc:annotation-driven />不执行任何扫描或检测@Controllers应用程序上下文中是否没有内容的操作,因此不进行任何请求映射。现在,您有几种在应用程序上下文中注册这些bean的方法,其中一种是上述方法<context:component- scan />。
@Controllers
<context:component- scan />
基本上@Controller没有<mvc:annotation-driven />,没错,是没什么用,因为它不只是占用内存。它不会绑定到传入的请求,而只是在应用程序上下文中徘徊。它只是所有其他bean一样的另一个bean,并没有对其进行任何特殊处理。(最近但已弃用的Spring版本会注册DefaultAnnotationHandlerMapping处理的@Controller,但已弃用)。
DefaultAnnotationHandlerMapping