欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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类图结构为

SpringMVC中IOC容器启动

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);
		}
	}
}

 其时序图如下

SpringMVC中IOC容器启动

 XmlWebApplication类结构如下:
SpringMVC中IOC容器启动

相关标签: spring