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