关于tomcat:深入源码了解Tomcat加载servlet的过程

6次阅读

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

简简单单,关机落班~

正文完
 0