ContextLoaderListener与DispatcherServlet

在基于XML的Spring MVC配置中,您必须在web.xml文件中看到两个声明,即ContextLoaderListenerDispatcherServlet。让我们试着理解他们在框架中的目的和他们的差异。

根和子上下文

在进一步阅读之前,请理解 -

  • Spring一次可以有多个上下文。其中一个将是根上下文,所有其他上下文将是子上下文。
  • 所有子上下文都可以访问根上下文中定义的bean; 但事实恰恰相反。根上下文无法访问子上下文bean。

DispatcherServlet - 子应用程序上下文

DispatcherServlet本质上是一个Servlet(它扩展HttpServlet),其主要目的是处理与配置的URL模式匹配的传入Web请求。它接受传入的URI并找到控制器和视图的正确组合。所以它是前端控制器。

定义DispatcherServletin 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创建根应用程序上下文,并与所有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

  1. ContextLoaderListener 创建根应用程序上下文
  2. DispatcherServlet 条目为每个servlet条目创建一个子应用程序上下文。
  3. 子上下文可以访问根上下文中定义的bean。
  4. 根上下文中的Bean无法直接访问子上下文中的bean。
  5. 所有上下文都被添加到ServletContext
  6. 您可以使用WebApplicationContextUtils类访问根上下文。

摘要

通常,您将在DispatcherServlet上下文中定义所有与MVC相关的bean(控制器和视图等),并在根上下文中定义所有交叉bean,例如安全性,事务,服务等ContextLoaderListener

通常,此设置工作正常,因为您很少需要访问任何MVC bean(从子上下文)到安全相关的类(从根上下文)。大多数情况下,我们在MVC类上使用安全bean,他们可以通过上面的设置访问它。

原文地址:https://howtodoinjava.com/spring-mvc/contextloaderlistener-vs-dispatcherservlet/

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值