SpringMVC中IOC容器启动
程序员文章站
2022-07-12 13:08:53
...
在web.xml文件中有
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListerner</listener-class>
</listener>
是通过类ContextLoaderListener来启动的,与ServletContext紧密相联,其实现了ServletContextListener接口,在contextInitialized中初始化上下文。ContextLoaderListener类图结构为
public void contextInitialized(ServletContextEvent event) {
initWebApplicationContext(event.getServletContext());
}
在初始化根上下文时,如果根上下文已经初始化过,则抛出IllegalStateException异常。调用createWebApplicationContext来创建web上下文。用determineContextClass来决定使用哪个上下文,先判断servletcontext是否存在contextClass参数,如果有就使用这个作为上下文类,否则使用defaultStrategies获取属性为org.springframework.web.context.WebApplicationContext的值,而defaultStrategies是通过读取ContextLoader.properties文件内的内容。
protected WebApplicationContext createWebApplicationContext(ServletContext sc) {
Class<?> contextClass = determineContextClass(sc);
if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) {
throw new ApplicationContextException("Custom context class [" + contextClass.getName() +
"] is not of type [" + ConfigurableWebApplicationContext.class.getName() + "]");
}
return (ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
}
protected Class<?> determineContextClass(ServletContext servletContext) {
String contextClassName = servletContext.getInitParameter(CONTEXT_CLASS_PARAM);
if (contextClassName != null) {
try {
return ClassUtils.forName(contextClassName, ClassUtils.getDefaultClassLoader());
}
catch (ClassNotFoundException ex) {
throw new ApplicationContextException(
"Failed to load custom context class [" + contextClassName + "]", ex);
}
}
else {
contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName());
try {
return ClassUtils.forName(contextClassName, ContextLoader.class.getClassLoader());
}
catch (ClassNotFoundException ex) {
throw new ApplicationContextException(
"Failed to load default context class [" + contextClassName + "]", ex);
}
}
}
其时序图如下
XmlWebApplication类结构如下:
上一篇: Python第二节(基础语法)