游历SpringMVC源码后发现,在web.xml中注册的ContextLoaderListener监听器只是初始化了一个根上下文,仅仅完成了组件扫描和与容器初始化相关的一些工作,并没有探测到具体每个URL应当map到哪个Controller, 哪个方法上。而剩一下的这些复杂工作都是由DispatcherServet来完成的,即应用服务器加载DispatcherServlet调用init()方法时才能触发这项工作。所以,如果在web.xml中配置DispatcherServlet时不设置
<load-on-startup>1</load-on-startup>
的话,那么很有可能应用服务器会在当用户实际访问请求到来时才加载DispatcherServlet,这样的话注册Controller, 解析request method, 注册RequestMapping, HandlerAdapter这样的初始化工作都会在响应请求时进行,就会大大延长第一个请求的处理时间。另外,DispatcherServlet持有了根容器的子容器引用,大量的状态信息都保存在它和它的父类当中,如果这个servlet中途被应用服务器销毁,那么也会带来重新加载的时间开销。
以上仅理论推测,未实际测试

本文深入解析SpringMVC初始化过程,重点阐述ContextLoaderListener在web.xml中的作用仅限于创建根上下文,而实际的URL与Controller映射等关键操作则由DispatcherServlet在init()方法中完成。若不提前加载DispatcherServlet,可能导致应用服务器在接收到用户请求后才进行初始化,从而显著增加首个请求的处理时间。同时,文章强调DispatcherServlet持有根容器的子容器引用,其状态信息存储可能导致重新加载时间开销。
1190

被折叠的 条评论
为什么被折叠?



