zoukankan      html  css  js  c++  java
  • 基于springmvc的web应用初始化流程和配置加载注意点

    基于springmvc的web应用在初始化时做了什么?application context何时加载?有几种加载方式?

     

    和所有的java web框架一样,springmvc实际上就是在典型的servlet处理request的流程上再包裹了一层而已。springmvc的初始化流程也同样和容器初始化servlet流程一样。容器初始化servlet上下文的流程如下,servlet context一般而言就是那个web.xml里设定上下文环境。

     

    springmvc中最典型的ServletContextListener实现就是ContextLoaderListener,其重写的contextInitialized方法
    定义了spring在初始化servletContext时的一些动作。
    其会加载由context-param参数contextConfigLocation中指定的spring application context配置文件。
    配置如下:

    Xml代码 
    1. <context-param>  
    2.         <param-name>contextConfigLocation</param-name>  
    3.         <param-value>  
    4.             /WEB-INF/applicationContext.xml /WEB-INF/applicationContext2.xml  
    5.         </param-value>  
    6.     </context-param>  

     

    使用 contextConfigLocation 加载指定路径的配置文件时,多个配置文件可以用逗号,冒号,空格, ,  中任一个来分隔。

    如果没有指定contextConfigLocation 参数,ContextLoaderListener会默认加载/WEB-INF/applicationContext.xml这个配置文件。

    springmvc将由ContextLoaderListener 载入的application context 叫做 "root application context" ,以区别于servlet的application context。

    ServletContextListener在servlet context里的配置参考如下:

    Xml代码 
    1. <listener>  
    2.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    3.     </listener>  

     


    如果没有在servlet context里配置,就不存在"root application context"。

    springmvc可以配置多个servlet,每一个 servlet都拥有各自的application context,相互之间不能相互访问。但是"root application context"却是对所有servlet都是可见的。

    如果servlet直接使用DispatcherServlet,其application context在DispatcherServlet的init 方法被调用时初始化。
    servlet application context的加载策略类似于root application context,首先会查找是否配置了servlet的init-param "contextConfigLocation",如果有,就使用 contextConfigLocation 指定的路径加载的配置文件时,多个配置文件可以用逗号,冒号,空格, ,  中任一个来分隔。


    如果没有指定"contextConfigLocation"参数,则会在   /WEB-INF/下查找 "servlet-name"+"-servlet.xml" 这样的文件加载。如下配置所示,就是/WEB-INF/springDispatcherServlet-servlet.xml 。

    Xml代码 
    1. <servlet>  
    2.         <servlet-name>springDispatcherServlet</servlet-name>  
    3.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    4.         <init-param>  
    5.             <param-name>contextConfigLocation</param-name>  
    6.             <param-value>  
    7.                 /WEB-INF/servlet-applicationContext.xml  
    8.             </param-value>  
    9.         </init-param>  
    10.         <load-on-startup>1</load-on-startup>  
    11.     </servlet>  
    12.   
    13.     <servlet-mapping>  
    14.         <servlet-name>springDispatcherServlet</servlet-name>  
    15.         <url-pattern>/mvc/*</url-pattern>  
    16.     </servlet-mapping>  

     


    最后,该servlet application context将root application context设置为parent,然后加载完成。

    以后在应用里调用applicationContext或者beanFactory的getBean方法去获取实例的时候,都是先尝试从父级application context获取,获取不到,再到当前application context里获取。

    除此之外,我们还可以在某个类里以编程式加载application context,比如使用ClassPathXmlApplicationContext或FileSystemXmlApplicationContext。不过这样加载的application context和root application context和servlet application context 分属于不同的可见范围。

  • 相关阅读:
    10.C# 构造函数
    9.C# 类
    8.C#友元程序集----可访问性相关
    7.C# 多态的实现
    4.C#虚方法virtual详解
    3.C#的访问权限修饰符
    2.静态类成员、静态构造函数、静态类
    1.面向对象的基本概念
    6.C# 释放非托管资源2
    原生js实现轮播图原理
  • 原文地址:https://www.cnblogs.com/zhaofei/p/3345605.html
Copyright © 2011-2022 走看看