SpringMVC:<context:component-scan>和<mvc:annotation-driven>必须在同一个上下文中?

时间:2016-11-05 10:52:35

标签: java spring spring-mvc servlets

ApplicationContext是WebApplicationContext的父级。

但是为什么并且必须在相同的背景下,它会起作用?

以下是我的解释:

=============

我像这样配置我的applicationConext.xml:

<context:component-scan base-package="com.github" />
<mvc:annotation-driven />

并且dispatcher-servlet.xml中没有类似的设置。

它有效!!!

===========

我按照以下方式配置我的dispatcher-servlet.xml:

<context:component-scan base-package="com.github" />
<mvc:annotation-driven />

并且applicationConext.xml中没有类似的设置。

它也有效!!!

==========

但是,如果我将<context:component-scan base-package="com.github" />放入applicationConext.xml并将<mvc:annotation-driven />放入dispatcher-servlet.xml OR ,请将<context:component-scan base-package="com.github" />放入dispatcher-servlet.xml中applicationConext.xml中的<mvc:annotation-driven />

它不起作用!!!返回httpStatus 404,未找到,这意味着它没有映射到Controller。

ApplicationContext是WebApplicationContext的父级,子上下文应该从父级conext继承,所以我认为设置可以在不同的上下文中分离,但不能相同!

我错了吗?请任何人都回答我,谢谢!

1 个答案:

答案 0 :(得分:1)

在Spring中,您拥有一个WebApplicationContext和至少一个子WebApplicationContext的根应用程序上下文,尽管您可以拥有多个DispatcherServlet和相应的WebApplicationContexts。这些是不同的上下文,尽管DispatcherServlet的WebApplicationContext是根应用程序上下文的子代。这意味着子上下文可以访问根应用程序上下文的所有bean,但它们仍然是两个不同的上下文。

现在使用相应的配置文件单独构建每个上下文。因此,如果您只在一个包中指定<context:component-scan />而在另一个包中指定<mvc-annoation-driven />,那么在构造一个上下文时,它将进行组件扫描,但由于您未启用,因此它不会注册任何与控制器相关的注释它们与<mvc-annoation-driven />在同一个配置文件中。现在在另一个上下文中,启用了与控制器相关的annoations,但是没有扫描任何组件。这就是没有找到映射的原因。

这也是为什么多个DispatcherServlet将使用的常见配置在根应用程序上下文中配置,而控制器相关配置在相应的Web应用程序上下文中配置。