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这个类,上图,此时无声胜有声:

简简单单,关机落班~