在web.xml中配置了ContextLoaderListener。
定义如下:
public class ContextLoaderListener extends ContextLoader [color=red]implements ServletContextListener [/color]{
因为实现了ServletContextListener 接口,所以在web容器启动的时候,就会执行该接口的方法contextInitialized()。
方法中this.contextLoader.initWebApplicationContext(event.getServletContext());
开始初始化。
ApplicationContext parent = loadParentContext(servletContext);
先取得parent 。在我经历的项目中,parent 没有配置。先不看。
然后是this.context = createWebApplicationContext(servletContext, parent);
然后是
Class<?> contextClass = determineContextClass(sc);
然后是 contextClassName = [color=red]defaultStrategies.getProperty(WebApplicationContext.class.getName());[/color]
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.
[color=red]org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext[/color]
所以框架默认的是XmlWebApplicationContext。
所以返回的contextClass是XmlWebApplicationContext实例。
接下来执行 ConfigurableWebApplicationContext wac =
(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
这个的目的就是利用XmlWebApplicationContext的构造方法,返回一个XmlWebApplicationContext实例。
其中的方法return [color=red]instantiateClass[/color](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.
[color=red]Note that this method tries to set the constructor accessible if given a non-accessible (that is, non-public) constructor[/color].
具体我还不是很了解,待续。
接下来是 wac.setParent(parent);
wac.setServletContext(sc);//保存sc的引用
[color=red]wac.setConfigLocation(sc.getInitParameter(CONFIG_LOCATION_PARAM));[/color]
其中的CONFIG_LOCATION_PARAM的值为
public static final String CONFIG_LOCATION_PARAM = "[color=red]contextConfigLocation[/color]";
这也是为什么我们的bean的定义文件必须配置在param为这个的下边的原因。
接下来是customizeContext(sc, wac);这个没看到具体实现,估计是扩展用的。
接下来就是最重要的最后一步wac.refresh();
待续。。。。。
定义如下:
public class ContextLoaderListener extends ContextLoader [color=red]implements ServletContextListener [/color]{
因为实现了ServletContextListener 接口,所以在web容器启动的时候,就会执行该接口的方法contextInitialized()。
方法中this.contextLoader.initWebApplicationContext(event.getServletContext());
开始初始化。
ApplicationContext parent = loadParentContext(servletContext);
先取得parent 。在我经历的项目中,parent 没有配置。先不看。
然后是this.context = createWebApplicationContext(servletContext, parent);
然后是
Class<?> contextClass = determineContextClass(sc);
然后是 contextClassName = [color=red]defaultStrategies.getProperty(WebApplicationContext.class.getName());[/color]
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.
[color=red]org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext[/color]
所以框架默认的是XmlWebApplicationContext。
所以返回的contextClass是XmlWebApplicationContext实例。
接下来执行 ConfigurableWebApplicationContext wac =
(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
这个的目的就是利用XmlWebApplicationContext的构造方法,返回一个XmlWebApplicationContext实例。
其中的方法return [color=red]instantiateClass[/color](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.
[color=red]Note that this method tries to set the constructor accessible if given a non-accessible (that is, non-public) constructor[/color].
具体我还不是很了解,待续。
接下来是 wac.setParent(parent);
wac.setServletContext(sc);//保存sc的引用
[color=red]wac.setConfigLocation(sc.getInitParameter(CONFIG_LOCATION_PARAM));[/color]
其中的CONFIG_LOCATION_PARAM的值为
public static final String CONFIG_LOCATION_PARAM = "[color=red]contextConfigLocation[/color]";
这也是为什么我们的bean的定义文件必须配置在param为这个的下边的原因。
接下来是customizeContext(sc, wac);这个没看到具体实现,估计是扩展用的。
接下来就是最重要的最后一步wac.refresh();
待续。。。。。