【问题标题】:SpringMVC : <context:component-scan /> and <mvc:annotation-driven> must in the same context?SpringMVC : <context:component-scan /> 和 <mvc:annotation-driven> 必须在同一个上下文中?
【发布时间】:2017-03-19 03:41:38
【问题描述】:

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 中没有类似的设置。

也可以啊!!!

===========

但是,如果我将 &lt;context:component-scan base-package="com.github" /&gt; 放入 applicationConext.xml 并将 &lt;mvc:annotation-driven /&gt; 放入 dispatcher-servlet.xml &lt;context:component-scan base-package="com.github" /&gt; 放入 dispatcher-servlet.xml 并将 &lt;mvc:annotation-driven /&gt; 放入 applicationConext。 xml。

不行!!!返回httpStatus 404,未找到,表示没有映射到Controller。

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

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

【问题讨论】:

    标签: java spring spring-mvc servlets


    【解决方案1】:

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

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

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

    【讨论】:

    • 那么父子上下文关系是什么意思呢?只从父类继承bean?
    • " 现在在另一个上下文中,与控制器相关的注释已启用,但从未扫描过任何组件。这就是找不到映射的原因。" --- 但我认为组件可以从父上下文继承,对吗?
    • 是的,Web 应用程序上下文从父根应用程序上下文继承 bean,但它们不是同一个上下文。
    • 正如我所写,由于上下文是单独创建的,因此您必须使用 &lt;mvc-annotation-driven /&gt; 启用与控制器相关的注释,并在同一上下文中启用组件扫描,否则您仅启用与控制器相关的注释而不实际扫描一个上下文中的组件,而在另一个上下文中您扫描组件但由于您没有在此处启用与控制器相关的注释,因此扫描时将找不到控制器映射。
    • 不客气。还有一件事需要澄清:上下文是单独构建的,子上下文不从根上下文继承任何配置文件,只有在配置根后从根中构造的 bean。这就是为什么您不能在不同的配置文件中进行组件扫描和注释驱动的原因。子配置文件不继承根配置文件的任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2011-10-04
    • 2012-11-29
    • 2014-04-11
    • 2011-04-11
    相关资源
    最近更新 更多