webapplication 初始化

在web.xml中配置了ContextLoaderListener。
定义如下:
public class ContextLoaderListener extends ContextLoader implements ServletContextListener {

因为实现了ServletContextListener 接口,所以在web容器启动的时候,就会执行该接口的方法contextInitialized()。

方法中this.contextLoader.initWebApplicationContext(event.getServletContext());
开始初始化。

ApplicationContext parent = loadParentContext(servletContext);
先取得parent 。在我经历的项目中,parent 没有配置。先不看。

然后是this.context = createWebApplicationContext(servletContext, parent);
然后是
Class<?> contextClass = determineContextClass(sc);
然后是 contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName());
try {
return ClassUtils.forName(contextClassName, ContextLoader.class.getClassLoader());
}

其中defaultStrategies会在static初始段初始化,它会默认去读spring的jar中的ContextLoader.properties文件。文件内容如下:
# Default WebApplicationContext implementation class for ContextLoader.
# Used as fallback when no explicit context implementation has been specified as context-param.
# Not meant to be customized by application developers.

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


所以框架默认的是XmlWebApplicationContext。

所以返回的contextClass是XmlWebApplicationContext实例。

接下来执行 ConfigurableWebApplicationContext wac =
(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);

这个的目的就是利用XmlWebApplicationContext的构造方法,返回一个XmlWebApplicationContext实例。

其中的方法return instantiateClass(clazz.getDeclaredConstructor());
描述如下:
Convenience method to instantiate a class using the given constructor. As this method doesn't try to load classes by name, it should avoid class-loading issues.

Note that this method tries to set the constructor accessible if given a non-accessible (that is, non-public) constructor.

具体我还不是很了解,待续。

接下来是 wac.setParent(parent);
wac.setServletContext(sc);//保存sc的引用
wac.setConfigLocation(sc.getInitParameter(CONFIG_LOCATION_PARAM));
其中的CONFIG_LOCATION_PARAM的值为
public static final String CONFIG_LOCATION_PARAM = " contextConfigLocation";
这也是为什么我们的bean的定义文件必须配置在param为这个的下边的原因。

接下来是customizeContext(sc, wac);这个没看到具体实现,估计是扩展用的。

接下来就是最重要的最后一步wac.refresh();

待续。。。。。

你可能感兴趣的:(application)