Spring-MVC理解之一:应用上下文webApplicationContext

一、先说ServletContext

  javaee标准规定了,servlet容器需要在应用项目启动时,给应用项目初始化一个ServletContext作为公共环境容器存放公共信息。ServletContext中的信息都是由容器提供的。

举例:

通过自定义contextListener获取web.xml中配置的参数

1.容器启动时,找到配置文件中的context-param作为键值对放到ServletContext中

2.然后找到listener,容器调用它的contextInitialized(ServletContextEvent event)方法,执行其中的操作

例如:在web.xml中配置

<context-param>
   <param-name>key</param-name>
   <param-value>value123</param-value>
</context-param>
<listener>
   <listener-class>com.brolanda.contextlistener.listener.ContextListenerTest</listener-class>
</listener>

配置好之后,在该类中获取对应的参数信息

package com.brolanda.contextlistener.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ContextListenerTest implements ServletContextListener {

    public void contextDestroyed(ServletContextEvent event) {
        System.out.println("*************destroy ContextListener*************");
    }

    @SuppressWarnings("unused")
    public void contextInitialized(ServletContextEvent event) {
        System.out.println("*************init ContextListener*************");
        ServletContext servletContext = event.getServletContext();
        System.out.println("key:"+servletContext.getInitParameter("key"));
    }

}

执行流程:

  web.xml在<context-param></context-param>标签中声明应用范围内的初始化参数

1.启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>

2.紧接着,容器创建一个ServletContext(上下文)。在该应用内全局共享。

3.容器将<context-param></context-param>转化为键值对,并交给ServletContext.

4.容器创建<listener></listener>中的类实例,即创建监听.该监听器必须实现自ServletContextListener接口

5.在监听中会有contextInitialized(ServletContextEvent event)初始化方法

在这个方法中获得ServletContext = ServletContextEvent.getServletContext();
            “context-param的值” = ServletContext.getInitParameter("context-param的键");

6.得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早.换句话说,这个时候,你对<context-param>中的键值做的操作,将在你的WEB项目完全启动之前被执行.

web.xml中可以定义两种参数:

一个是全局参数(ServletContext),通过<context-param></context-param>

一个是servlet参数,通过在servlet中声明        <init-param>

<param-name>param1</param-name>

<param-value>avalible in servlet init()</param-value>

</init-param>

第一种参数在servlet里面可以通过getServletContext().getInitParameter("context/param")得到

第二种参数只能在servlet的init()方法中通过this.getInitParameter("param1")取得

二、spring上下文容器配置

  spring为我们提供了实现ServletContextListener接口的上下文初始化监听器:org.springframework.web.context.ContextLoaderListener

  spring为我们提供的IOC容器,需要我们指定容器的配置文件,然后由该监听器初始化并创建该容器。要求你指定配置文件的地址及文件名称,一定要使用:contextConfigLocation作为参数名称。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml,/WEB-INF/jason-servlet.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

该监听器,默认读取/WEB-INF/下的applicationContext.xml文件。但是通过context-param指定配置文件路径后,便会去你指定的路径下读取对应的配置文件,并进行初始化。

三、spring上下文容器配置后,初始化了什么?

  既然,ServletContext是由Servlet容器初始化的,那spring的ContextLoaderListener又做了什么初始化呢?

1、servlet容器启动,为应用创建一个“全局上下文环境”:ServletContext

2、容器调用web.xml中配置的contextLoaderListener,初始化WebApplicationContext上下文环境(即IOC容器),加载context-param指定的配置文件信息到IOC容器中。WebApplicationContext在ServletContext中以键值对的形式保存

3、容器初始化web.xml中配置的servlet,为其初始化自己的上下文信息servletContext,并加载其设置的配置信息到该上下文中。将WebApplicationContext设置为它的父容器。

4、此后的所有servlet的初始化都按照3步中方式创建,初始化自己的上下文环境,将WebApplicationContext设置为自己的父上下文环境。

对于作用范围而言,在DispatcherServlet中可以引用由ContextLoaderListener所创建的ApplicationContext中的内容,而反过来不行。

当Spring在执行ApplicationContext的getBean时,如果在自己context中找不到对应的bean,则会在父ApplicationContext中去找。这也解释了为什么我们可以在DispatcherServlet中获取到由ContextLoaderListener对应的ApplicationContext中的bean。

四、spring配置时:<context:exclude-filter>的使用原因,为什么在applicationContext.xml中排除controller,而在spring-mvc.xml中incloud这个controller

既然知道了spring的启动流程,那么web容器初始化webApplicationContext时作为公共的上下文环境,只需要将service、dao等的配置信息在这里加载,而servlet自己的上下文环境信息不需要加载。故,在applicationContext.xml中将@Controller注释的组件排除在外,而在dispatcherServlet加载的配置文件中将@Controller注释的组件加载进来,方便dispatcherServlet进行控制和查找。故,配置如下:

applicationContext.mxl中:

<context:component-scan base-package="com.linkage.edumanage">

<context:exclude-filter expression="org.springframework.stereotype.Controller"    type="annotation" />

</context:component-scan>

spring-mvc.xml中:

<context:component-scan base-package="com.brolanda.cloud"   use-default-filters="false">

<context:include-filter expression="org.springframework.stereotype.Controller"    type="annotation" />

</context:component-scan>

时间: 2024-08-01 08:46:30

Spring-MVC理解之一:应用上下文webApplicationContext的相关文章

Java框架-Spring MVC理解001

Spring MVC理解 最近在读一本<看透springMVC>的书,从了解到了一些更加精细系统的知识,边读变分享吧. 1.servlet--Spring MVC的本质 2.Spring MVC其实是一个工具,具体的理解可以分为两步:第一步,了解这个工具是怎么创建出来的:第二步,了解这个工具是怎么用的. 3.前期使用准备:环境的搭建 ①创建WEB项目,导入jar包,Maven项目简单的加入springMVC和servlet的依赖就可以了. //Maven项目加入依赖 <dependenc

Java框架-Spring MVC理解005-DispatcherServlet

DispatcherServlet 通过源码我们可以看到,onRefresh方法是DispatcherServlet的入口方法.onRefresh中简单地调用了initStrategies,在initStrategies中调用了9个初始化方法. // org.springframework.web.servlet.DispatcherServlet protected void onRefresh(ApplicationContext context) { initStrategies(cont

Java框架-Spring MVC理解002-关联源代码

Spring MVC-关联源代码 首先说一下我们为什么要关联源代码: 其实,我觉得阅读源码是一个非常好的学习方式,在我们日常工作中或多或少都会接触一些开源代码,比如说最常用的非常流行的Struts.Hibernate.Spring这些框架的源码.这些优秀的源码中有着多年积淀下来的精华,是非常值得我们学习的,不管我们当前是什么水平,通过反复阅读源码能力能有所提升,小到对源码所提供的功能上的使用更加熟练,大到使我们的程序设计更加完美优秀. 具体步骤: 将spring的源代码关联上去.在关联之前首先需

Spring mvc 上下文初始化过程

在软件开发的中,如果某些特性的使用比较普遍,那么这些特性往往可以作为平台特性来实现,通过对这些平台特性进行有效的封装,使其向其他应用开放.正是如此,Spring由于其IOC.AOP.事务处理.持久化驱动等特点,使得其起到了一个应用平台的作用.Spring MVC是Spring的一个重要的模块,其web应用的实现,是由Spring的来支撑的,Spring MVC的是实现也是依托再Spring平台提供的基础特性的.本文主要是介绍Spring mvc容器初始化的过程,从中可以看出Spring MVC的

扯谈spring mvc之WebApplicationContext的继承关系

spring mvc里的root/child WebApplicationContext的继承关系 在传统的spring mvc程序里会有两个WebApplicationContext,一个是parent,从applicationContext.xml里加载的,一个是child,从servlet-context.xml里加载的. 两者是继承关系,child WebApplicationContext 可以通过getParent()函数获取到root WebApplicationContext.

Spring MVC 入门 - 框架搭建

感觉网上从环境搭建讲起的教程不多,好多示例也比较复杂,而且也没个图啥的,所以就上一个简单易懂的版本. 有多简单捏?从eclipse建立工程开始,结束后作出一个可以响应请求的Servlet. 在这个文章里面,我们需要 - 建立一个eclipse工程: 编写两个xml: 编写两个jsp页面: 编写一个Java文件. 准备工作 - Eclipse J2EE版本: Tomcat 一只: 注:所有斜体字代表-文件名,类名,变量名等可替换内容. 第一步: 使用Eclipse建立动态网页工程. 输入项目名字,

Spring MVC 零配置

1. pring MVC的核心就是DispatcherServlet类,Spring MVC处理请求的流程如下图所示: 2. Spring MVC中典型的上下文层次 当我们初始化一个DispatcherServlet类时,Spring MVC会在web应用的WEB-INF目录下查找一个名字叫:[servlet-name]-servlet.xml的配置文件,查询这个文件中定义的bean并初始化.[servlet-name]-servlet.xml的定义的bean初始化时将会覆盖在全局范围内(glo

Spring MVC组件源码分析

组件概览 HandlerMapping 根据 request 找到对应的处理器 Handler 和 Interceptors.内部只有一个方法 HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception; HandlerAdapter Handler 适配器,内部方法如下: boolean supports(Object handler);//判断是否可以使用某个 Handler ModelAndVi

Spring MVC 学习笔记(二)

6. 视图和视图解析器  ?  Spring MVC如何解析视图 ? 请求处理方法执行完成后,最终返回一个ModelAndView对象.对于那些返回String,View或ModeMap等类型的处理方法,spring MVC 都会在内部将它们装配成一个ModelAndView对象,它包含了逻辑名和模型对象的视图 ? Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是JSP也可是Excell. JFreeChart等各种表现形式的视图

spring 上下文和spring mvc上下文和web应用上下文servletContext之间的关系

要想很好理解这三个上下文的关系,需要先熟悉spring是怎样在web容器中启动起来的.spring的启动过程其实就是其IoC容器的启动过程,对于web程序,IoC容器启动过程即是建立上下文的过程. spring的启动过程: 首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境: 其次,在web.xml中会提供有contextLoaderListener.在web容器启动时,