Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @Controller的弹簧支持由<;上下文:组件扫描/>;vs<;mvc:注释驱动>;_Java_Spring_Spring Mvc - Fatal编程技术网

Java @Controller的弹簧支持由<;上下文:组件扫描/>;vs<;mvc:注释驱动>;

Java @Controller的弹簧支持由<;上下文:组件扫描/>;vs<;mvc:注释驱动>;,java,spring,spring-mvc,Java,Spring,Spring Mvc,我一直在研究使用mvc:annotation-driven标记时我们还有哪些额外的功能,我很难消化结果,特别是关于@Controller注释。我知道这很像,但请听我说 根据 @Controller注释的基本目的是充当注释类的原型,指示其角色。dispatcher将扫描这些带注释的类以查找映射的方法,检测@RequestMapping注释(参见下一节) 文档接着显示context:component扫描标记提供了这种支持。这一切都很好,但是我在看mvc:annotation-driven给了我们什

我一直在研究使用mvc:annotation-driven标记时我们还有哪些额外的功能,我很难消化结果,特别是关于@Controller注释。我知道这很像,但请听我说

根据

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

文档接着显示context:component扫描标记提供了这种支持。这一切都很好,但是我在看mvc:annotation-driven给了我们什么,前面提到的stackoverflow提供了以下答案

mvc:annotation-driven声明了对注释驱动的mvc控制器的显式支持(即@RequestMapping、@Controller,尽管对这些控制器的支持是默认行为),以及通过@Valid和@RequestBody/ResponseBody的消息正文封送来添加对声明性验证的支持

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

[mvc:annotation driven]注册Spring mvc向@Controller发送请求所需的DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter bean


这听起来与我在文档中提供的最后一个示例非常相似。如果有人能提供一些示例,说明我们可以仅使用context:component扫描标记对@Controller注释做些什么,有哪些限制,然后是添加mvc:annotation-driven标记时得到的附加功能,我认为这将非常有帮助。提前感谢您对此的支持。

上下文:组件扫描元素列出了Spring应该扫描@Controller注释的包(在
基本包
属性中)

mvc:annotation-driven
没有这样的属性。这是一个方便的元素,它将许多默认MVC元素安装到应用程序上下文中。本规范第16.14.1节列出了这些要素。此元素似乎不扫描@Controller注释


与普遍的看法相反,这些元素之间没有依赖性。没有mvc:annotation-driven的@Controller可以正常工作,并且可以很好地处理HTTP请求,只要您包含了带有适当的
基本包属性的
context:component scan

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

顾名思义,用于组件扫描。默认情况下,它扫描带有
@组件
注释(或
@Controller
@Service
等“子”注释)的所有bean。它将仅在应用程序上下文中将这些类的实例注册为bean。仅此而已

用于引导Spring MVC,它注册了一个
RequestMappingHandlerMapping
RequestMappingHandlerAdapter
。第一个链接将请求链接到某个方法(对
@Controller
注释类中的方法的
@RequestMapping
注释)。最后一个知道如何执行用
@RequestMaping
注释的方法

现在,
对扫描或检测
@控制器不做任何操作
如果应用程序上下文中没有控制器,则不进行请求映射。现在您有了几种在应用程序上下文中注册这些bean的方法,其中之一就是前面提到的

基本上,没有
@Controller
是非常无用的,因为它只会占用内存。它不会绑定到传入的请求,只是挂在应用程序上下文中。它只是一个和所有其他豆子一样的豆子,没有对它做任何特殊的处理。(Spring的最新但已弃用的版本注册了处理
@Controller
DefaultAnnotationHandlerMapping
,但已弃用)

  • 案例1(注释驱动)

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

  • 案例2(组件扫描)

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


    • 一个没有控制器的@Controller毫无用处,因为它什么都不做
      ?好吧,它应该可以正常工作。这取决于spring版本、您需要的功能以及配置的其余部分(这如何影响DispatcherServlet的自动配置)。