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