天天看点

Spring初始化 - 启动过程一.配置监听器二.概述三.Spring上下文创建过程

一.配置监听器

为了让web容器启动时,也初始化Spring,则需要在web.xml中配置监听器ContextLoaderListener,web容器启动时触发监听器,初始化Spring

<listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    </listener>  
           

二.概述

1. ContextLoaderListener继承了ContextLoader,ContextLoader中有静态代码块

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
}
           
创建一个子类实例(new XxxClass()),执行过程:
	父类静态代码块—>
	子类静态代码块—>
	主方法(执行哪个程序就执行哪个程序的主方法)—>
	父类非静态代码块—>
	父类无参构造函数—>
	子类非静态代码块—>
	子类无参构造函数(若实际子类执行的是有参构造函数,则不执行无参构造函数)—>
	成员函数(指定执行哪个就执行哪个成员函数,若重写了父类成员函数,则只执行子类的成员函数)
           

2. 所以在创建ContextLoaderListener实例时,先执行了父类ContextLoader中的静态代码块:

/**
	 * 类路径资源的名称(相对于ContextLoader类)
	 * 定义了ContextLoader的默认策略名称。
	 */
	private static final String DEFAULT_STRATEGIES_PATH = "ContextLoader.properties";

	// 记录了Spring上下文的默认实现类:XmlWebAppliactionContext
	private static final Properties defaultStrategies;

	// 静态代码块在类加载时加载
	static {
		// 从属性文件加载默认策略实现。
		try {
			ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, ContextLoader.class);
			defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
		}
		catch (IOException ex) {
			throw new IllegalStateException("Could not load 'ContextLoader.properties': " + ex.getMessage());
		}
	}
           
Spring初始化 - 启动过程一.配置监听器二.概述三.Spring上下文创建过程

3. 父类静态代码块执行完,属性defaultStrategies中记录了上下文默认实现 - XmlWebAppliactionContext key:      org.springframework.web.context.WebApplicationContext         value:  org.springframework.web.context.support.XmlWebApplicationContext

Spring初始化 - 启动过程一.配置监听器二.概述三.Spring上下文创建过程

参数defaultStrategies用于没有在web.xml中配置Spring上下文的实现类,就会从defaultStrategies获取默认的上下文实现类

三.Spring上下文创建过程

Spring初始化 - 启动过程一.配置监听器二.概述三.Spring上下文创建过程