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继承,所以我认为设置可以在不同的上下文中分离,但不能相同!
我错了吗?请任何人都回答我,谢谢!
答案 0 :(得分:1)
在Spring中,您拥有一个WebApplicationContext
和至少一个子WebApplicationContext
的根应用程序上下文,尽管您可以拥有多个DispatcherServlet
和相应的WebApplicationContexts。这些是不同的上下文,尽管DispatcherServlet的WebApplicationContext
是根应用程序上下文的子代。这意味着子上下文可以访问根应用程序上下文的所有bean,但它们仍然是两个不同的上下文。
现在使用相应的配置文件单独构建每个上下文。因此,如果您只在一个包中指定<context:component-scan />
而在另一个包中指定<mvc-annoation-driven />
,那么在构造一个上下文时,它将进行组件扫描,但由于您未启用,因此它不会注册任何与控制器相关的注释它们与<mvc-annoation-driven />
在同一个配置文件中。现在在另一个上下文中,启用了与控制器相关的annoations,但是没有扫描任何组件。这就是没有找到映射的原因。
这也是为什么多个DispatcherServlet将使用的常见配置在根应用程序上下文中配置,而控制器相关配置在相应的Web应用程序上下文中配置。