游历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: web.xml中声明DispatcherServlet时一定要添加load-on-startup标签
原文:http://blog.csdn.net/neosmith/article/details/44227227