根上下文和子上下文
在进一步阅读之前,请理解——
Spring 一次可以有多个上下文。其中一个是根上下文,所有其他上下文都是子上下文。
所有子上下文都可以访问根上下文中定义的bean;但相反是不正确的。根上下文无法访问子上下文 bean。
应用上下文:
applicationContext.xml 是每个 Web 应用程序的根上下文配置。
Spring 加载 applicationContext.xml 文件并为整个应用程序创建 ApplicationContext。
每个 Web 应用程序只有一个应用程序上下文。
如果您没有使用 contextConfigLocation 参数在 web.xml 中显式声明上下文配置文件名,Spring 将在 WEB-INF 文件夹下搜索 applicationContext.xml,如果找不到该文件,则抛出 FileNotFoundException。
ContextLoaderListener
为根应用程序上下文执行实际的初始化工作。
读取“contextConfigLocation”上下文参数并将其值传递给上下文实例,将其解析为可能的多个文件路径,这些路径可以由任意数量的逗号和空格分隔,例如“WEB-INF/applicationContext1.xml、WEB-INF/applicationContext2.xml”。
ContextLoaderListener 是可选的。在这里说明一点:您可以启动 Spring 应用程序而无需配置 ContextLoaderListener,只需使用 DispatcherServlet 的基本最小 web.xml。
DispatcherServlet
DispatcherServlet 本质上是一个 Servlet(它扩展了 HttpServlet),其主要目的是处理与配置的 URL 模式匹配的传入 Web 请求。它接受传入的 URI 并找到控制器和视图的正确组合。所以它是前端控制器。
当您在 spring 配置中定义 DispatcherServlet 时,您会使用 contextConfigLocation 属性提供一个包含控制器类、视图映射等条目的 XML 文件。
WebApplicationContext
除了 ApplicationContext,一个 Web 应用程序中还可以有多个 WebApplicationContext。
简单来说,每个 DispatcherServlet 关联单个 WebApplicationContext。
xxx-servlet.xml 文件特定于 DispatcherServlet,一个 Web 应用程序可以配置多个 DispatcherServlet 来处理请求。
在这种情况下,每个 DispatcherServlet 都会配置一个单独的 xxx-servlet.xml。但是,applicationContext.xml 对于所有 servlet 配置文件都是通用的。
默认情况下,Spring 会从你的 webapps WEB-INF 文件夹中加载名为“xxx-servlet.xml”的文件,其中 xxx 是 web.xml 中的 servlet 名称。
如果要更改该文件名的名称或更改位置,请添加带有 contextConfigLocation 作为参数名称的 initi-param。
它们之间的比较和关系:
ContextLoaderListener vs DispatcherServlet
ContextLoaderListener 创建根应用程序上下文。
DispatcherServlet 条目为每个 servlet 条目创建一个子应用程序上下文。
子上下文可以访问根上下文中定义的 bean。
根上下文中的 bean 不能(直接)访问子上下文中的 bean。
所有上下文都添加到 ServletContext。
您可以使用 WebApplicationContextUtils 类访问根上下文。
阅读Spring文档后,理解如下:
a) 应用程序上下文是分层的,WebApplicationContexts 也是如此。请参阅此处的文档。
b) ContextLoaderListener 为 web 应用程序创建一个根 web-application-context 并将其放入 ServletContext。此上下文可用于加载和卸载 spring 管理的 bean,而与控制器层中使用的技术(Struts 或 Spring MVC)无关。
c) DispatcherServlet 创建自己的 WebApplicationContext 并且处理程序/控制器/视图解析器由该上下文管理。
d) 当 ContextLoaderListener 与 DispatcherServlet 一起使用时,首先创建一个根 web-application-context,如前所述,DispatcherSerlvet 也创建一个子上下文并附加到根应用程序上下文。请参阅此处的文档。
当我们使用 Spring MVC 并且也在服务层中使用 Spring 时,我们提供了两个应用程序上下文。第一个使用 ContextLoaderListener 配置,另一个使用 DispatcherServlet
通常,您将在 DispatcherServlet 上下文中定义所有与 MVC 相关的 bean(控制器和视图等),并通过 ContextLoaderListener 在根上下文中定义所有横切 bean,例如安全性、事务、服务等。
更多详情请参考:
https://siddharthnawani.blogspot.com/2019/10/contextloaderlistener-vs.html