ServletContextServletContext是WEB应用程序的全局信息存储空间。它在服务器启动时创建,在服务器关闭时销毁。即Spring容器应用上下文的初始化当WEB应用启动时,ServletContext被初始化,Spring提供的ContextLoaderListener会监听这个事件,会调用ContextLoaderListener.contextInitialized方法//在这个方法中,Spring会初始化根上下文,即WebApplicationContextinitWebApplicationContext(event.getServletContext())WebApplicationContext的实际实现类是XmlWebApplicationContext,它是Spring的IOC容器,对应托管Bean的定义由web.xml中的context-param标签指定。xml(即applicationContext.xml)。IOC容器初始化后,Spring使用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE作为属性Key,存储在ServletContext中,方便在启动过程中获取SpringMVCConfigurationweb.xmlservice_dispatcherorg.springframework.web.servlet.DispatcherServletcontextConfigLocation/WEB-INF/spring/services/service_dispatcher-servlet.xml<load-on-startup>1这个配置会初始化DispatcherServlet,load-on-startup的意思是在启动容器的时候初始化启动ServletSpringMVC的过程,其实就是DispatcherServlet的初始化进程DispatcherServlet的继承关系是FrameworkServlet->HttpServletBean->HttpServlet->Servlet。通过使用ServletAPI响应HTTP请求,成为SpringMVC的前端处理器,对每一个请求进行转发、匹配和处理。DispatcherServlet初始化从HttpServletBean重写父类的init方法开始}//从init参数设置bean属性。try{//获取web.xml(即springmvc-config.xml)中的contextConfigLocation配置属性,SpringMVC配置文件PropertyValuespvs=newServletConfigPropertyValues(getServletConfig(),this.requiredProperties);BeanWrapperbw=PropertyAccessorFactory.forBeanPropertyAccess(this);//获取ServletContextResourceLoaderresourceLoader=newServletContextResourceLoader(getServletContext());bw.registerCustomEditor(Resource.class,newResourceEditor(resourceLoader,getEnvironment()));//模板方法,可以在子类中调用做一些初始化工作,bw代表DispatcherServletinitBeanWrapper(bw);//将配置的初始化值设置为DispatcherServletbw.setPropertyValues(pvs,true);}catch(BeansExceptionex){logger.error("Failedtosetbeanpropertiesonservlet'"+getServletName()+"'",ex);throwex;}//让子类任意初始化。//模板方法,子类初始化的入口方法initServletBean();if(logger.isDebugEnabled()){logger.debug("Servlet'"+getServletName()+"'配置成功");}}HttpServletBean使用Spring的委托类BeanWrapper设置DispatcherServlet的值,在FrameworkServlet.initServletBean()进一步初始化上下文FrameworkServlet使用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE从ServletContext中获取Spring的根上下文(即WebApplicationContext)作为父上下文,Spring使用与Servlet名称相关的属性(这里不简单命名为ServletKey,但是经过一些改造)作为属性Key,同时也保存在ServletContext中供后续使用.因此在applicationContext.xml中将@Controller注解的组件排除在外,在配置中加载@Controller注解的组件dispatcherServlet加载的文件,方便DispatcherServlet控制和查找