contextloaderlistener
在基于XML的Spring MVC配置中,您必须在web.xml
文件中看到两个声明,即contextloaderlistener
和DispatcherServlet
。让我们试着理解他们在框架中的目的和他们的差异。
根和子上下文
在进一步阅读之前,请理解 -
- Spring一次可以有多个上下文。其中一个将是根上下文,所有其他上下文将是子上下文。
- 所有子上下文都可以访问根上下文中定义的bean; 但事实恰恰相反。根上下文无法访问子上下文bean。
DispatcherServlet - 子应用程序上下文
DispatcherServlet
本质上是一个Servlet(它扩展HttpServlet
),其主要目的是处理与配置的URL模式匹配的传入Web请求。它接受传入的URI并找到控制器和视图的正确组合。所以它是前端控制器。
定义DispatcherServlet
in spring配置时,使用contextconfiglocation
属性提供包含控制器类,视图映射等条目的XML文件。
|
如果您不提供配置文件,那么它将使用加载自己的配置文件[servlet_name]-servlet.xml
。Web应用程序可以定义任意数量的DispatcherServlet
条目。每个servlet都在自己的命名空间中运行,使用映射,处理程序等加载自己的应用程序上下文。
这意味着每个人DispatcherServlet
都可以访问Web应用程序上下文。直到规定,每个DispatcherServlet
创建自己的内部Web应用程序上下文。
从Spring 3.x开始,方法使用给定的Web应用程序上下文DispatcherServlet(WebAPPlicationContext webapplicationContext)
创建一个新DispatcherServlet
的。只有在Servlet 3.x环境中才有可能通过ServletContext.addServlet(java.lang.String, java.lang.String)
API支持。
ContextLoaderListener - 根应用程序上下文
ContextLoaderListener
创建根应用程序上下文,并与所有DispatcherServlet
上下文创建的子上下文共享。你只能有一个条目web.xml
。
|
ContextLoaderListener
包含全局可见的bean 的上下文,如服务,存储库,基础结构bean等。创建根应用程序上下文后,它将ServletContext
作为属性存储,名称为:
|
要在Spring控制器中获取根应用程序上下文,可以使用WebApplicationContextUtils
类。
|
ContextLoaderListener与DispatcherServlet
下图描述了单一视图中的整个关系。
ContextLoaderListener与DispatcherServlet
ContextLoaderListener
创建根应用程序上下文DispatcherServlet
条目为每个servlet条目创建一个子应用程序上下文。- 子上下文可以访问根上下文中定义的bean。
- 根上下文中的Bean无法直接访问子上下文中的bean。
- 所有上下文都被添加到
ServletContext
。 - 您可以使用
WebApplicationContextUtils
类访问根上下文。
摘要
通常,您将在DispatcherServlet
上下文中定义所有与MVC相关的bean(控制器和视图等),并在根上下文中定义所有交叉bean,例如安全性,事务,服务等ContextLoaderListener
。
通常,此设置工作正常,因为您很少需要访问任何MVC bean(从子上下文)到安全相关的类(从根上下文)。大多数情况下,我们在MVC类上使用安全bean,他们可以通过上面的设置访问它。
原文地址:https://howtodoinjava.com/spring-mvc/contextloaderlistener-vs-dispatcherservlet/
相关阅读
ContextLoaderListener与RequestContextListener的对
ContextLoaderListener与RequestContextListener(1)ContextLoaderListenerContextLoaderListenerextends ContextLoader implements