共计 1415 个字符,预计需要花费 4 分钟才能阅读完成。
Tomcat 加载 servlet 过程
有人活了大半辈子还不晓得 servlet 是啥?它在 tomcat 中又是怎么生存的呢?来,安顿上~~
让咱们把回顾拉回到很久很久以前,呃,就是 springboot 启动的工夫点,找到 ServletWebServerApplicationContext#refresh() 这个办法,走上来,是 onRefresh() 办法里的 createWebServer() 办法,点开它:
这里以 dispatcherServlet 的加载为例,待会就盯着她。点开 getSelfInitializer() 办法,在要害中央打个断点:
能够看到,这里通过 getServletContextInitializerBeans() 办法,获取到所有的 ServletContextInitializer 进行遍历,调用各自的 onStartup()。在遍历到 DispatcherServletRegistrationBean 的时候,进入 onStartup() 办法看看:
曾经看到 dispatcherServlet 了,感觉离胜利不远啰~
点 register(description, servletContext) 进去:
再点 addRegistration() 进入,拼上最初一口气,追到这里,看要害代码:
private ServletRegistration.Dynamic addServlet(String servletName, String servletClass, Servlet servlet, Map<String,String> initParams) throws IllegalStateException {
……
// 查找 context 里是否有该 servlet(这里的 context 是 TomcatEmbeddedContext,// servletName 是 dispatcherServlet)Wrapper wrapper = (Wrapper) context.findChild(servletName);
// 查找不到,则创立一个增加到 context 中。Wrappe 封装了 servlet
if (wrapper == null) {wrapper = context.createWrapper();
wrapper.setName(servletName);
context.addChild(wrapper);
}
………
// 持续设置 wrapper 的 servlet 属性
wrapper.setServletClass(servlet.getClass().getName());
wrapper.setServlet(servlet);
……
// 构建 ApplicationServletRegistration 返回
ServletRegistration.Dynamic registration =
new ApplicationServletRegistration(wrapper, context);
return registration;
}
啰啰嗦嗦了半天,一句话概括就是: 把 servlet 注册到 context 里
到这里,已是柳暗花明。咱们再讲讲这里的 dispatcherServlet 是什么时候创立的。
再回忆公元前某个夜晚,咱们讲的 springboot 主动拆卸原理,关上:
关上 DispatcherServletAutoConfiguration 这个类,上图,此时无声胜有声:
简简单单,关机落班~