Spring MVC的容器初始化过程。
先来看一下,初始化的大体流程:
然后,我们再来看一下,我们的控制器DispatcherServlet的类图及继承关系。
首先web.xml中定义了servlet,load-on-startup=1:
服务器启动的时候对该servlet进行初始化,调用HttpServletBean的init方法:
该方法里又会调用initSertlvetBean进行初始化。
initSertlvetBean这个方法是在FrameWorkServlet中定义的:
initWebApplicationContext是对Spring mvc容器的初始化。
而initFrameworkServlet();方法的实现是空的,可以由子类重写。
现在我们继续initWebApplicationContext():
WebApplicationContext parent =WebApplicationContextUtils.getWebApplicationContext(getServletContext());
protected void finishRefresh() {publishEvent(new ContextRefreshedEvent(this));}
public void publishEvent(ApplicationEvent event) {Assert.notNull(event, "Event must not be null");if (logger.isDebugEnabled()) {logger.debug("Publishing event in context [" + getId() + "]: " + event);}getApplicationEventMulticaster().multicastEvent(event);if (this.parent != null) {this.parent.publishEvent(event);}}
public void multicastEvent(final ApplicationEvent event) {for (Iterator it = getApplicationListeners().iterator(); it.hasNext();) {final ApplicationListener listener = (ApplicationListener) it.next();getTaskExecutor().execute(new Runnable() {public void run() {listener.onApplicationEvent(event);}});}}
public interface ApplicationListener extends EventListener {/** * Handle an application event. * @param event the event to respond to */void onApplicationEvent(ApplicationEvent event);}
public void onApplicationEvent(ApplicationEvent event) {if (event instanceof ContextRefreshedEvent) {this.refreshEventReceived = true;onRefresh(((ContextRefreshedEvent) event).getApplicationContext());}}
protected void onRefresh(ApplicationContext context) throws BeansException {initStrategies(context);}/** * Initialize the strategy objects that this servlet uses.* <p>May be overridden in subclasses in order to initialize* further strategy objects.*/protected void initStrategies(ApplicationContext context) {initMultipartResolver(context);initLocaleResolver(context);initThemeResolver(context);initHandlerMappings(context);initHandlerAdapters(context);initHandlerExceptionResolvers(context);initRequestToViewNameTranslator(context);initViewResolvers(context);}