启动.....
访问web.xml.在web.xml中找到dispatcherService前端控制器。
DispatcherService继承了FrameworkServlet,FrameworkServlet继承了HttpServiceBean,HttpServiceBean继承了HttpService;
HttpServiceBean的init()方法会执行。
HttpServiceBean的init()方法初始化DespatcherService的配置参数。
HttpServiceBean的init()方法调用initServletBean()方法,
该方法是空的,他的子类FrameWorkService重写了该方法,调用FrameWorkService的initServerBean()方法,
FrameWorkService的initServerBean()方法初始化了sprinvMVC容器:
initWebApplicationContext是对Spring mvc容器的初始化的。
CreateWebApplicationContext(parent)是初始化Spring mvc的过程:
这个过程会生成一个 XmlWebApplicationContext 的实例,也就是Spring MVC的容器。
初始化完成springMVC以后,3.和spring父容器进行关联,使得mvc容器能访问spring容器里面的bean,
之后会调用Spring的refresh()方法。
该方法实现了对bean的初始化。
得到并配置了BeanFactory.
注册了MessageSource。
注册了监听类ApplicationEventMulticaster
实例化所有的单例bean:finishBeanFactoryInitialization(beanFactory);
重点在于最后一步,finishRefresh();这一步会触发一个ApplicationEvent:
,进入 AbstractApplicationContext中的
protected void finishRefresh() {
publishEvent(new ContextRefreshedEvent(this));
}
其中this是指XmlWebApplicationContext对象。
接下来继续调用AbstractApplicationContext中的:publishEvent()方法。
发送者:XmlWebApplicationContext发布的这个event。XmlWebApplicationContext这个对象有个applicationEventMulticaster对象,实际为SimpleApplicationEventMulticaster对象。
实际的消息就是在这里发布的。
接受者:接受者实际就是DispatcherServlet,因为DispatcherServlet实现了ApplicationListener接口 :
当发布了消息后,实际上就是调用了DispatcherServlet(实际这个方法在DispatcherServlet的父类FrameworkServlet中)的onApplicationEvent方法,我们来看一下onApplicationEvent的实现:
之后调用子类DispatcherServlet的onRefresh(ApplicationContext context)方法
onRefresh()方法重启context,并初始化DispatcherServlet策略组件(bean)(文件解析器、映射器、适配器、异常解析器、视图解析器、数据保存重定向等初始化)
实际上,在进行initStrategies的时候,上有的bean都已经加载好了。
到此为止!!
wac = createWebApplicationContext(parent);结束了!!
接下来,将spring mvc的context注册到servletcontext:
getServletContext().setAttribute(attrName, wac);
到此为止!!
this.webApplicationContext = initWebApplicationContext();结束!
整个Spring MVC的加载结束了!
简化:
1. web应用启动时扫描web.xml文件,扫描到DispatcherServlet,对其进行初始化
2. 调用DispatcherServlet父类的父类HttpServletBean的init()方法,把配置DispatcherServlet的初始化参数设置到DispatcherServlet中,调用子类FrameworkServlet的initServletBean()方法
3. initServletBean()创建springMVC容器实例并初始化容器,并且和spring父容器进行关联,使得mvc容器能访问spring容器里面的bean,之后调用子类DispatcherServlet的onRefresh(ApplicationContext context)方法
4. onRefresh(ApplicationContext context)进行DispatcherServlet的策略组件初始化工作,url映射初始化,文件解析初始化,运行适配器初始化等等。