java之SpringMVC : context:component-scan/> and mvc:annotation-driven> must in the same context
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 和 <mvc:annotation-driven />
中在 applicationConext.xml 中。
它不起作用!!!返回httpStatus 404,not found,表示没有映射到Controller。
ApplicationContext 是 WebApplicationContext 的父级,子级 context 应该继承父级 conext,所以我认为设置可以在不同的上下文中分开,但不能在同一个上下文中分开!
我错了吗?请任何人都可以回答我,谢谢!
请您参考如下方法:
在 Spring 中,您拥有根应用程序上下文,它是一个 WebApplicationContext
和至少一个 child WebApplicationContext
, 虽然你可以有多个 DispatcherServlet
s 具有相应的 WebApplicationContexts。这些是不同的上下文,尽管 DispatcherServlet 的 WebApplicationContext
是根应用程序上下文的子项。这意味着子上下文可以访问根应用程序上下文的所有 beans,但它们仍然是两个不同的上下文。
现在每个上下文都是使用相应的配置文件单独构建的。因此,如果您仅指定 <context:component-scan />
在一个包装中 <mvc-annoation-driven />
在另一个中,然后在构建一个上下文时它将进行组件扫描,但它不会注册任何与 Controller 相关的注释,因为您没有使用 <mvc-annoation-driven />
启用它们。在同一个配置文件中。现在在另一个上下文中,启用了与 Controller 相关的注释,但从未扫描过任何组件。这就是找不到映射的原因。
这也是为什么将由多个 DispatcherServlet 使用的通用配置在根应用程序上下文中配置,而 Controller 相关配置在相应的 Web 应用程序上下文中配置。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。