SpringMVC初始化流程

启动.....

访问web.xml.web.xml中找到dispatcherService前端控制器。

DispatcherService继承了FrameworkServletFrameworkServlet继承了HttpServiceBean,HttpServiceBean继承了HttpService

HttpServiceBeaninit()方法会执行。

 

HttpServiceBeaninit()方法初始化DespatcherService的配置参数。

HttpServiceBeaninit()方法调用initServletBean()方法,

 

该方法是空的,他的子类FrameWorkService重写了该方法,调用FrameWorkServiceinitServerBean()方法,

FrameWorkServiceinitServerBean()方法初始化了sprinvMVC容器:

 


initWebApplicationContext是对Spring mvc容器的初始化

CreateWebApplicationContext(parent)是初始化Spring mvc的过程:

 

这个过程会生成一个 XmlWebApplicationContext 的实例,也就是Spring MVC的容器。

初始化完成springMVC以后,3.spring父容器进行关联,使得mvc容器能访问spring容器里面的bean

之后会调用Springrefresh()方法。

 

该方法实现了对bean的初始化。

得到并配置了BeanFactory.

注册了MessageSource

注册了监听类ApplicationEventMulticaster

实例化所有的单例beanfinishBeanFactoryInitialization(beanFactory);

重点在于最后一步,finishRefresh();这一步会触发一个ApplicationEvent

,进入 AbstractApplicationContext中的

protected void finishRefresh() {  

    publishEvent(new ContextRefreshedEvent(this));  

}  

其中this是指XmlWebApplicationContext对象。

接下来继续调用AbstractApplicationContext中的:publishEvent()方法。

 

发送者:XmlWebApplicationContext发布的这个eventXmlWebApplicationContext这个对象有个applicationEventMulticaster对象,实际为SimpleApplicationEventMulticaster对象。

 

实际的消息就是在这里发布的。

接受者:接受者实际就是DispatcherServlet,因为DispatcherServlet实现了ApplicationListener接口 :

 

当发布了消息后,实际上就是调用了DispatcherServlet(实际这个方法在DispatcherServlet的父类FrameworkServlet中)的onApplicationEvent方法,我们来看一下onApplicationEvent的实现:

 

之后调用子类DispatcherServletonRefresh(ApplicationContext context)方法

 

onRefresh()方法重启context,并初始化DispatcherServlet策略组件(bean)(文件解析器、映射器、适配器、异常解析器、视图解析器、数据保存重定向等初始化)

实际上,在进行initStrategies的时候,上有的bean都已经加载好了。

到此为止!!

wac = createWebApplicationContext(parent);结束了!!

接下来,将spring mvccontext注册到servletcontext

getServletContext().setAttribute(attrName, wac);

到此为止!!

this.webApplicationContext = initWebApplicationContext();结束!

整个Spring MVC的加载结束了!

 简化:

1. web应用启动时扫描web.xml文件,扫描到DispatcherServlet,对其进行初始化

2. 调用DispatcherServlet父类的父类HttpServletBeaninit()方法,把配置DispatcherServlet的初始化参数设置到DispatcherServlet中,调用子类FrameworkServletinitServletBean()方法

3. initServletBean()创建springMVC容器实例并初始化容器,并且和spring父容器进行关联,使得mvc容器能访问spring容器里面的bean,之后调用子类DispatcherServletonRefresh(ApplicationContext context)方法

4. onRefresh(ApplicationContext context)进行DispatcherServlet的策略组件初始化工作,url映射初始化,文件解析初始化,运行适配器初始化等等。

猜你喜欢

转载自blog.csdn.net/z695284766/article/details/80677434