SpringMVC-父子容器启动原理剖析
2022-10-24 15:36:56 0 举报
SpringMVC-父子容器启动原理剖析
作者其他创作
大纲/内容
AbstractDispatcherServletInitializer#registerDispatcherServlet
#初始化我们web上下文对象的 用于文件上传下载的解析器对象initMultipartResolver(context);
FrameworkServlet#initWebApplicationContext
设置DispatcherServlet的过滤器
!this.refreshEventReceived
YES
new AnnotationConfigWebApplicationContext();创建子容器
AbstractContextLoaderInitializer#registerContextLoaderListener
进行初始化
拿到WebApplicationInitializer实现类,并实例化
//初始化我们的HandlerMappinginitHandlerMappings(context);
AbstractDispatcherServletInitializer#onStartup
//主题解析器对象初始化initThemeResolver(context);
//实例化我们的HandlerAdaptersinitHandlerAdapters(context);
AbstractContextLoaderInitializer#createRootApplicationContext创建父容器context
注册一个监听器(该监听会初始化springmvc所需信息)new ContextRefreshListener()
new AnnotationConfigWebApplicationContext()context.register(configClasses);
创建父容器,注册配置类
ContextRefreshListener#onApplicationEvent监听器的触发
实例化我们的spring root上下文 创建父容器
是否可以把所有Bean都通过Spring容器来管理?(Spring的applicationContext.xml中配置全局扫描)不可以,这样会导致我们请求接口的时候产生404。 如果所有的Bean都交给父容器,SpringMVC在初始化HandlerMethods的时候(initHandlerMethods)无法根据Controller的handler方法注册HandlerMethod,并没有去查找父容器的bean;也就无法根据请求URI 获取到 HandlerMethod来进行匹配.
初始化完后发布事件
ContextLoader#initWebApplicationContext监听器的初始化
调用父容器的refresh方法刷新上下文ContextLoader#configureAndRefreshWebApplicationContext
springboot方式
创建DispatcherServlet
refreshEventReceived 它会在容器加载完设置为true (通过事件onApplicationEvent)springboot在这初始化组件
NO
wac = this.webApplicationContext;获得子容器
this.webApplicationContext != null
//初始化我们web上下文对象用于处理国际化资源的initLocaleResolver(context);
//实例化我们处理器异常解析器对象initHandlerExceptionResolvers(context);initRequestToViewNameTranslator(context);
HttpServletBean#init
initializer.onStartup(servletContext);
AbstractAnnotationConfigDispatcherServletInitializer#getRootConfigClasses获取父容器配置类,可继承进行自定义配置
StandardContext#loadOnStartup
获得ContextLoaderListener存的父容器
FrameworkServlet#initServletBean
AbstractAnnotationConfigDispatcherServletInitializer#getServletConfigClasses获得配置类,可继承进行自定义配置
DispatcherServlet#initStrategies
创建监听器ContextLoaderListener设置到上下文中
创建父子容器
子容器的初始化
DispatcherServlet的初始化
xml方式会在这里创建父容器
循环进行调用
AbstractAnnotationConfigDispatcherServletInitializer#createServletApplicationContext创建子容器,MVC容器 webApplicationContext
注册我们的DispatcherServlet
//给DispatcherSerlvet的ViewResolvers处理器initViewResolvers(context);initFlashMapManager(context);
SpringServletContainerInitializer#onStartup
父容器的初始化
YES XML方式
注册配置类
onRefresh(wac);
初始化ServletinitServlet
this.context == null
FrameworkServlet#onApplicationEvent
加载ServletloadServlet
xml会在这里创建createWebApplicationContext(rootContext);
初始化Servlet,创建Spring容器
DispatcherServlet#onRefresh
配置并且加载子容器FrameworkServlet#configureAndRefreshWebApplicationContext
Tomcat.startup()
设置启动配置
ContextLoaderListener#contextInitialized
在servlet域中设置根容器(在子容器就可以直接拿到了)
cwac.isActive()是否激活
配置和刷新上下文
font color=\"#f44336\
Spring和SpringMVC为什么需要父子容器?不要不行吗?就实现层面来说不用子父容器也可以完成所需功能(参考:SpringBoot就没用子父容器)1.所以父子容器的主要作用应该是早期Spring为了划分框架边界。有点单一职责的味道。service、dao层我们一般使用spring框架来管理、controller层交给springmvc管理2.规范整体架构 使 父容器service无法访问子容器controller、子容器controller可以访问父容器 service3.方便子容器的切换。如果现在我们想把web层从spring mvc替换成struts,那么只需要将spring-mvc.xml替换成Struts的配置文件struts.xml即可,而spring-core.xml不需要改变。 4.为了节省重复bean创建
0 条评论
下一页