• spring默认启动位置以及contextConfigLocation设置源码解析


    这几天在看spring的源码,涉及到spring启动位置的部分,下面就看看spring到底是从哪儿开始加载的。本文使用的是spring3.0M3 

    首先spring的加载会借助一个监听器ContextLoaderListener,直接上web.xml文件 

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




    我们通常会对加载位置统一管理   

    Xml代码  收藏代码
    1. <context-param>  
    2.        <param-name>contextConfigLocation</param-name>  
    3.        <param-value>  
    4.         /WEB-INF/conf/spring/**/*.xml  
    5.        </param-value>  
    6.    </context-param>  


    这个org.springframework.web.context.ContextLoaderListener类型是springframework中的原始加载上下文的监听器, 
    通常我们会自定义一个Listener去继承ContextLoaderListener并另外实现我们需要初始化的接口(通常我们会选择实现一些接口来对session的管理) 

    Java代码  收藏代码
    1. public class FrameServletContextListener extends ContextLoaderListener implements ServletContextListener,HttpSessionAttributeListener,HttpSessionListener {  
    2.     //  
    3.     private ServletContext initPath(ServletContextEvent event) {  
    4.   
    5.     }  
    6.   
    7.         public synchronized void contextDestroyed(ServletContextEvent event) {  
    8.     //  
    9.     }  
    10.   
    11.     ...  
    12. }  


    当监听器设置好了之后 ,启动web容器 监听器开始启动ContextLoaderListenerl 
    类中的方法contextInitialized() 

    Java代码  收藏代码
    1. /** 
    2.  * Initialize the root web application context. 
    3.  */  
    4. public void contextInitialized(ServletContextEvent event) {  
    5.     this.contextLoader = createContextLoader();  
    6.     if (this.contextLoader == null) {  
    7.         this.contextLoader = this;  
    8.     }  
    9.     this.contextLoader.initWebApplicationContext(event.getServletContext());  
    10. }  


    这样this.contextLoader.initWebApplicationContext(event.getServletContext());ContextLoaderListener 
    就会借助容器的上下文去初始一个spring的应用上下文,使用到了ContextLoader这个类 



    在ContextLoader初始化时我们看到这样一块static代码 

    Java代码  收藏代码
    1. static {  
    2.     // Load default strategy implementations from properties file.  
    3.     // This is currently strictly internal and not meant to be customized  
    4.     // by application developers.  
    5.     try {  
    6.         //这一句会去加载同在此包下的一个properties文件的值(ContextLoader.properties)  
    7.         ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, ContextLoader.class);  
    8.         defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);  
    9.     }  
    10.     catch (IOException ex) {  
    11.         throw new IllegalStateException("Could not load 'ContextLoader.properties': " + ex.getMessage());  
    12.     }  
    13. }  


    属性文件中这样定义 

    引用
    org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext


    这样我们就能根据属性文件中的定义反射出一个XmlWebApplicationContext上下文了 

    然而我们在XmlWebApplicationContext中看到如下变量 

    Java代码  收藏代码
    1. /** Default config location for the root context */  
    2. public static final String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml";  


    至此我们已经知道默认加载spring文件的启动位置了 


    当我们再看ContextLoader类,我们就会看到传说中的参数contextConfigLocation 

    Java代码  收藏代码
    1. public static final String CONFIG_LOCATION_PARAM = "contextConfigLocation";  



    而XmlWebApplicationContext对象正是调用了这个参数去设置启动位置 

    Java代码  收藏代码
    1. wac.setConfigLocation(servletContext.getInitParameter(CONFIG_LOCATION_PARAM));  



    再往上看XmlWebApplicationContext继承的AbstractRefreshableConfigApplicationContext类中的setConfigLocation方法将此抽象类中的String[] configLocations值填充 

    并在AbstractRefreshableConfigApplicationContext类中我们看到spring对默认启动文件位置和配置启动文件位置的支持 

    Java代码  收藏代码
    1. protected String[] getConfigLocations() {  
    2.     return (this.configLocations != null ? this.configLocations : getDefaultConfigLocations());  


    至此我们已经清楚spring将从哪儿加载并知道加载哪些文件了。

  • 相关阅读:
    在VMware 虚拟机中彻底删除linux系统
    Linux中安装MySQL5.7和查看启动状态
    VMware启动时提示我已移动或我已复制该虚拟机
    Linux中查看MySQL版本启动默认安装位置
    linux 下查看redis是否启动和启动命令
    Linux中查看redis版本
    maven下载依赖失败解决方案
    《痞子衡嵌入式半月刊》 第 27 期
    痞子衡嵌入式:盘点国内车规级MCU厂商
    痞子衡嵌入式:盘点国内Cortex-M内核MCU厂商高性能产品
  • 原文地址:https://www.cnblogs.com/xigua1hao/p/5310458.html
Copyright © 2020-2023  润新知