10. Spring MVC 启动流程
2022-03-16 20:18:02 0 举报
AI智能生成
Spring MVC 启动流程
作者其他创作
大纲/内容
Spring MVC 单容器启动流程
SpringServletContainerInitializer<br>它是 servlet 提供的 SPI 规范<br>Tomcat 启动时会加载实现<br>
SpringServletContainerInitializer.onStartup()<br>由 Tomcat 调用 SPI 实现类的这个方法
循环所有的 webAppInitializerClasses<br>找到所有的实现类,过滤后通过反射创建实例<br>此时【WebMvcApplication】类会加载
WebMvcApplication.onStartup()<br>回调 onStartup() 方法完成初始化<br>
AnnotationConfigWebApplicationContext<br>创建一个空的 IOC 容器
DispatcherServlet<br>向 servletContext 中注册一个 DispatcherServlet 组件
DispatcherServlet<br>Tomcat 在启动时,会为每一个 servlet 创建对象<br>同时还会执行 init() 方法
HttpServletBean.init()<br>DispatcherServlet 继承了 HttpServletBean<br>所以会执行它的 init() 方法<br>
FrameworkServlet.initServletBean()<br>调用子类的 initServletBean() 方法
initWebApplicationContext()<br>初始化 Web IOC 容器<br>
从 servletContext 获取 root 根容器,这时获取不到<br>所以 rootContext 就为 null
校验当前的 Spring 容器是否有父容器<br>如果没有就把 rootContext 设置到当前容器的父容器中,所以父容器也为 null
configureAndRefreshWebApplicationContext()<br>初始化和刷新容器
wac.refresh()<br>Spring 容器的刷新
FrameworkServlet<br>它实现了监听器机制
ContextRefreshListener.onApplicationEvent()<br>监听 ContextRefreshedEvent 事件<br>
FrameworkServlet.this.onApplicationEvent(event)<br>调用 onApplicationEvent() 方法
DispatcherServlet.onRefresh()<br>调用子类的 onRefresh() 方法
initStrategies(context)<br>把 Spring 容器上下文传入,完成九大组件的初始化
Spring MVC 父子容器启动流程
SpringServletContainerInitializer<br>它是 servlet 提供的 SPI 规范<br>Tomcat 启动时会加载实现
onStartup()<br>由 Tomcat 调用 SPI 实现类的这个方法
循环所有的 webAppInitializerClasses<br>找到所有的实现类,过滤后通过反射创建实例<br>此时【WebIsolationApplication】类会加载
AbstractDispatcherServletInitializer.onStartup()<br>先调用父类的 onStartup() 方法
AbstractContextLoaderInitializer.onStartup()<br>父类的 onStartup() 方法
registerContextLoaderListener()<br>注册监听器
createRootApplicationContext()<br>创建 Spring 父容器
getRootConfigClasses()<br>获取 Spring 父容器的配置类
AnnotationConfigWebApplicationContext<br>创建 Spring 父容器
调用 register() 方法传入 Spring 的配置类
ContextLoaderListener<br>初始化一个 ServletContextListener 监听器<br>把上面创建好的 Spring 父容器绑定到 ContextLoaderListener 监听器上
registerDispatcherServlet()<br>注册监听器
createServletApplicationContext()<br>创建一个 Spring MVC 子容器
AnnotationConfigWebApplicationContext<br>创建 Spring MVC 子容器
getServletConfigClasses()<br>获取 Spring MVC 子容器的配置
调用 register() 方法传入 Spring MVC 的配置类
createDispatcherServlet()<br>创建 DispatcherServlet 组件<br>把上面创建好的 Spring MVC 子容器绑定到 DispatcherServlet 组件上
getServletMappings()<br>指定 DispatcherServlet 组件的拦截路径
ContextLoaderListener<br>它是一个 ServletContextListener 监听器<br>在容器启动时调用 contextInitialized() 方法<br>
ContextLoaderListener.contextInitialized()<br>在这里完成了 Spring 父容器的启动
initWebApplicationContext()<br>初始化 Spring 父容器
此时的 context 就是之前创建好的 Spring 父容器<br>给 Spring 父容器再设置父容器(null)
configureAndRefreshWebApplicationContext()<br>初始化和刷新容器
wac.refresh()<br>Spring 父容器的刷新
将 Spring 容器保存到 servletContext 的属性中,后面会用到
DispatcherServlet<br>Tomcat 在启动时,会为每一个 servlet 创建对象<br>同时还会执行 init() 方法
HttpServletBean.init()<br>DispatcherServlet 继承了 HttpServletBean<br>所以会执行它的 init() 方法
FrameworkServlet.initServletBean()<br>调用子类的 initServletBean() 方法
initWebApplicationContext()<br>初始化 Web IOC 容器
从 servletContext 获取 root 根容器,实际上就是 Spring 容器<br>此时 rootContext = Spring 容器
校验当前的 Spring MVC 子容器是否有父容器<br>如果没有就把 rootContext 设置到当前容器的父容器中
configureAndRefreshWebApplicationContext()<br>初始化和刷新容器<br>
wac.refresh()<br>Spring MVC 子容器的刷新<br>
0 条评论
下一页