标签:context ali tco 定义 反射 let 自定义 情况下 app
spring通过监听ServletContext的初始化来创建父容器,ContextLoaderListener是实现了ServletContextListener接口的实现类,UML如图所示:
UML中我们看到ContextLoaderListener不仅实现了ServletContextListener,还继承了ContextLoader。这意味着ContextLoaderListener包含了两种职责:
1)监听ServletContext初始化;
2)配置加载spring容器;
通常情况下ContextLoaderListener将被配置在web.xml中或者通过SPI机制添加到ServletContext中,在ServletContext初始化的时候将会触发该监听器,回调contextInitialized(ServletContextEvent event)方法。
ContextLoaderListener在触发回调方法以后就直接初始化spring的容器,调用initWebApplicationContext方法。
进入initWebApplicationContext方法
该方法主要做了两件事
1)createWebApplicationContext创建WebApplicationContext的实例对象
2)configureAndRefreshWebApplicationContext配置并刷新context
该方法选择WebApplicationContext的实现类,并反射创建实例对象,选择方法如下
我们看到,它首先从servletContext中获取配置的contextClass,如果没有配置那么降级从默认策略里面拿contextClass,默认是XmlWebApplicationContext。
该方法也做了两件事
1)配置WebApplicationContext
1-1)配置context的唯一ID
1-2)获取并配置contextConfigLocation
1-3)将ServletContext中的键值配置加入到Environment中
1-4)处理自定义配置接口ApplicationContextInitializer的实现类
2)refresh
构造完毕WebApplicationContext,并且配置完成以后将调用context的refresh方法,该方法是创建spring容器的核心方法。
总得来说ContextLoaderListener作为spring父容器的起始点,创建并配置spring父容器从这里开始。
标签:context ali tco 定义 反射 let 自定义 情况下 app
原文地址:https://www.cnblogs.com/lay2017/p/11267032.html