一.配置监听器
为了让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());
}
}
3. 父类静态代码块执行完,属性defaultStrategies中记录了上下文默认实现 - XmlWebAppliactionContext key: org.springframework.web.context.WebApplicationContext value: org.springframework.web.context.support.XmlWebApplicationContext
参数defaultStrategies用于没有在web.xml中配置Spring上下文的实现类,就会从defaultStrategies获取默认的上下文实现类