springmvc启动流程源码解析

来源:互联网 发布:nginx中文 编辑:程序博客网 时间:2024/05/27 00:33

spring的启动首先会去加载web.xml中的配置我们分析也是从这里开始

<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
                classpath:spring-mvc.xml
            </param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>

由于DispacherServlet的父类是FrameworkServlet而FrameworkServlet的父类是HttpServletBean

启动DispacherServlet会调用HttpServletBean中的init方法:

public final void init() throws ServletException {
PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));
initBeanWrapper(bw);
bw.setPropertyValues(pvs, true);

initServletBean();

}


这里的重点是initServeltBean,它在HttpServletBean中是一个模板方法实现是其子类FrameworkServlet

@Override
protected final void initServletBean() throws ServletException {
this.webApplicationContext = initWebApplicationContext();
initFrameworkServlet();
}

这里重要的是这两句一个是initWebApplicationContext(),再一句是initFrameworkServlet()。initWebApplicationContext()它做的工作就是创建高级IOC容器而InitFrameWorkServlet()则是一个空的方法

具体的实现:

protected WebApplicationContext initWebApplicationContext() {
WebApplicationContext rootContext =WebApplicationContextUtils.getWebApplicationContext(getServletContext());
WebApplicationContext wac = null;
     if (this.webApplicationContext != null) {
wac = this.webApplicationContext;
if (wac instanceof ConfigurableWebApplicationContext) {
ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac;
if (!cwac.isActive()) {

if (cwac.getParent() == null) {
cwac.setParent(rootContext);
}
configureAndRefreshWebApplicationContext(cwac);
   }
 }
}
if (wac == null) {
wac = findWebApplicationContext();
}
if (wac == null) {
wac = createWebApplicationContext(rootContext);
}


if (!this.refreshEventReceived) {
onRefresh(wac);
}


if (this.publishContext) {

String attrName = getServletContextAttributeName();
getServletContext().setAttribute(attrName, wac);
}
return wac;
}


到这里就创建了高级的IOC容器了

原创粉丝点击