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这个类,上图,此时无声胜有声:
简简单单,关机落班~