根上下文和子上下文 在进一步阅读之前,请理解——</p>
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 与 DispatcherServlet
ContextLoaderListener 创建根应用程序上下文。DispatcherServlet 条目为每个 servlet 条目创建一个子应用程序上下文。子上下文可以访问根上下文中定义的 bean。根上下文中的 bean 不能(直接)访问子上下文中的 bean。所有上下文都添加到 ServletContext。您可以使用 WebApplicationContextUtils 类访问根上下文。
看完Spring文档,理解如下:
a) 应用程序上下文是分层的,WebApplicationContexts 也是如此。请参阅此处的文档。
b) ContextLoaderListener creates a root web-application-context for the web-application and puts it in the ServletContext. This context can be used to load and unload the spring-managed beans ir-respective of what technology is being used in the controller layer(Struts or Spring MVC).
c) DispatcherServlet creates its own WebApplicationContext and the handlers/controllers/view-resolvers are managed by this context.
d) When ContextLoaderListener is used in tandem with DispatcherServlet, a root web-application-context is created first as said earlier and a child-context is also created by DispatcherSerlvet and is attached to the root application-context. Refer documentation here.
当我们使用 Spring MVC 并且也在服务层中使用 Spring 时,我们提供了两个应用程序上下文。第一个使用 ContextLoaderListener 配置,另一个使用 DispatcherServlet
通常,您将在 DispatcherServlet 上下文中定义所有与 MVC 相关的 bean(控制器和视图等),并通过 ContextLoaderListener 在根上下文中定义所有横切 bean,例如安全性、事务、服务等。
有关更多详细信息,请参阅此内容:
https ://siddharthnawani.blogspot.com/2019/10/contextloaderlistener-vs.html