ContextLoaderListener与DispatcherServlet版权声明
原创在基于XML的Spring MVC配置,您必须 web.xml 文件中有两个声明,即 ContextLoaderListener 和 DispatcherServlet 。让我们试着了解他们在框架中的目的及其差异。
根和子上下文
在进一步阅读之前,请理解 -
- Spring一次可以有多个上下文。其中一个将是根上下文,所有其他上下文将是子上下文。
- 所有子上下文所有都可以访问bean; 但事实恰恰相反。根上下文无法访问子上下文bean。
DispatcherServlet - 子应用程序上下文
[DispatcherServlet](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html) 本质上是Servlet(它扩展 HttpServlet ),其主要目的是处理和配置URL模式匹配传入Web要求它接受传入URI并找到控制器和视图的正确组合。所以它是前控制器。
定义 DispatcherServlet in spring配置时,请使用 contextConfigLocation 属性提供包含控制器类、视图映射等的条目。XML文件。
web.xml中
< servlet >
< servlet-name >employee-services</ servlet-name >
< servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class >
< init-param >
< param-name >contextConfigLocation</ param-name >
< param-value >classpath:employee-services-servlet.xml</ param-value >
</ init-param >
< load-on-startup >1</ load-on-startup >
</ servlet >
如果您没有提供配置文件,那么它将使用 [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](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/context/ContextLoaderListener.html) 创建根应用程序上下文并使用所有 DispatcherServlet 上下文创建的子上下文共享。 您只能有一个条目 web.xml 。
web.xml中
< listener >
< listener-class >
org.springframework.web.context.ContextLoaderListener
</ listener-class >
</ listener >
< context-param >
< param-name >contextConfigLocation</ param-name >
< param-value >/WEB-INF/spring/applicationContext.xml</ param-value >
</ context-param >
ContextLoaderListener 包含全局可见的bean 上下文,如服务、存储库、基础设施。bean等待创建根应用程序上下文后,它将。 ServletContext 作为属性存储,名称为:
组织/ springframework的/ WEB /上下文/ ContextLoader.java
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this .context);
//Where attibute is defined in /org/springframework/web/context/WebApplicationContext.java as
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext. class .getName() + ".ROOT" ;
要 在Spring获取控制器中的根应用程序上下文。 ,可以使用 WebApplicationContextUtils 类。
Controller.java
@Autowired
ServletContext context;
ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(context);
if (ac == null ){
return "root application context is null" ;
}
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/
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123



