由 vs 给出的@Controller的Spring支持
我一直在研究使用mvc:annotation-driven标签时我们有哪些额外的function,我很难消化结果,特别是在@Controller注释方面。 我知道这与这个问题非常相似,但请听我说。
根据Spring文档
@Controller注释的基本目的是充当带注释的类的构造型,指示其角色。 调度程序将扫描这些带注释的类以查找映射方法,检测@RequestMapping注释(请参阅下一节)。
然后,文档继续显示上下文:component-scan标记提供此支持。 所以这一切都很好,但后来我看着mvc:annotation-driven给了我们什么,前面提到的stackoverflow 问题提供了以下答案
mvc:annotation-driven声明显式支持注释驱动的MVC控制器(即@RequestMapping,@ Controller,虽然支持这些是默认行为),并通过@Valid添加对declrativevalidation的支持,并使用@RequestBody添加消息体编组/ ResponseBody。
这对我来说似乎有点多余。 也许我没有得到这种明确的支持。 再次,回顾官方Spring 文档,我们得到以下内容
[mvc:annotation-driven]注册Spring MVC将请求分派给@Controllers所需的DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter bean。
这听起来与我从文档中提供的最后一个例子非常相似。 如果有人能够提供一些关于我们如何使用@Controller注释只使用上下文:component-scan标签,一些限制是什么,那么我们在添加mvc:annotation-driven时获得的附加function的示例标签,我认为这将非常有帮助。 在此先感谢您对此的任何支持。
这两个元素的用途完全不同。
顾名思义,
用于组件扫描。 它默认使用@Component
注释扫描所有bean(或者像@Controller
, @Service
@Controller
等“sub”注释)。 它只会将应用程序上下文中这些类的实例注册为bean。 就这些。
用于引导Spring MVC,它注册了RequestMappingHandlerMapping
和RequestMappingHandlerAdapter
。 第一个链接请求到某个方法(对@Controller
注释类中的方法的@RequestMapping
注释)。 最后一个知道如何执行使用@RequestMaping
注释的方法。
现在,
对于扫描或检测@Controllers
没有任何作用,如果应用程序上下文中没有,则不会进行任何请求映射。 现在,您可以通过多种方式在应用程序上下文中注册这些bean,其中一种方法是前面提到的
。
基本上没有
的@Controller
是非常没用的,因为它除了占用内存之外什么都不做。 它不会绑定到传入的请求,它只是在应用程序上下文中挂起。 它只是像所有其他bean一样的另一个bean,并没有做任何特别的事情。 (最近但已弃用的Spring版本注册了DefaultAnnotationHandlerMapping
,它处理@Controller
,但不推荐使用)。
context:component-scan
元素列出了Spring应该扫描@Controller注释base-package
(在base-package
属性中)。
mvc:annotation-driven
没有这样的属性。 这是一个便利元素,它将许多默认MVC元素安装到应用程序上下文中。 这些元素在Spring框架参考的 16.14.1节中列出。 此元素似乎不扫描@Controller注释。
与普遍看法相反,这些元素之间没有依赖关系。 没有mvc:annotation-driven
的@Controller将正常运行并处理HTTP请求就好了 ,只要你包含了context:component-scan
和适当的base-package
属性。
-
案例1(注释驱动)
这是启用Spring注释标记。 可以使用所有注释,如
@Controller, @Service, @Autowired
等。 这不会创建一个bean,但会找到注释,如果找到注释,spring会为该类创建相应的bean(例如@Controller, @Service, @Autowired
等)。 -
案例2(组件扫描)
Spring将扫描声明中指定的类的包(和子包)并为其创建bean。