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/
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除