[图片] 开头说两句 小刀博客: https://www.lixiang.red 小刀公众号: 程序员学习大本营 学习背景 上一波,我们一起学习了 digester 进行 servlet.xml 的解析和 servlet 容器的初始化 https://www.lixiang.red/articles/2019/08/0 ..

tomcat 学习 |Tomcat 应用各个组件的默认值

开头说两句

小刀博客: https://www.lixiang.red
小刀公众号: 程序员学习大本营

学习背景

上一波,我们一起学习了 digester 进行 servlet.xml 的解析和 servlet 容器的初始化
https://www.lixiang.red/articles/2019/08/08/1565275684493.html
通过上述的学习,我们知道在 server.xml 对 server, service , Host 等并没有指定 className 来初始化实例,用的是默认的 Standard 系列的初始化,今天我们就一起把各个组件的默认值给一起找出来

组件的默认值

Server->StandardServer
Service->StandardService
Executor->StandardThreadExecutor(tomcat 里面的线程池实现,为所有的 Service 所共用)
Connector->new Connector(attributes.getValue("protocol"));
在 EngineRuleSet 中,我们可以看到和 Engine 相关的一系列的初始化
image.png
Engine->StandardEngine
engineConfigClass->org.apache.catalina.startup.EngineConfig
会被转化成 LifecycleListener
Host->StandardHost
hostConfigClass->org.apache.catalina.startup.HostConfig
Context->StandardContext
configClass->org.apache.catalina.startup.ContextConfig
从源码中我们可以看到,Context 下面都是和我们的 Web 应用息息相关的.如 session , cookie,Parameter
最重要的一点是:
Context 中设置的 loader 是一个 WebappLoader. 对每个 Context 都会去新建一个 WebappLoader , 所以说,tomcat 中的 Web 应用都是单独的类加载器.

digester.addObjectCreate(prefix + "Context/Loader",
                            "org.apache.catalina.loader.WebappLoader",
                            "className");
        digester.addSetProperties(prefix + "Context/Loader");
        digester.addSetNext(prefix + "Context/Loader",
                            "setLoader",
                            "org.apache.catalina.Loader");

在加载完 Context 之后,会设置 Engine 的类加载器

digester.addRule("Server/Service/Engine",
                         new SetParentClassLoaderRule(parentClassLoader));
        addClusterRuleSet(digester, "Server/Service/Engine/Cluster/");

SetParentClassLoaderRule:
会取出 digester 当前栈顶的元素,并为栈顶的元素设置类加载器

Container top = (Container) digester.peek();
        top.setParentClassLoader(parentClassLoader);

其中的 parentClassLoader 如下代码所示,是 SharedClassLoader

 /**
     * The shared extensions class loader for this server.
     */
    protected ClassLoader parentClassLoader =
        Catalina.class.getClassLoader();

Tomcat 中的类加载器

在上述分析中,我们看到了类加载器的初始化,实际上,在 Tomcat 中,有四种类加载器,分别是 Common Class Loader, Catalina Class Loader , Shared Class Loader , Web App Class Loader.
他们可以加载不同位置的类,做到隔离的效果,也可以做到通用的效果
细致的说明我们下一篇文章再细细介绍

最后说两句

Tomcat 中大多数的组件都可以看成 Container , 如下图所示
image.png,
同时也都有着完整的生命周期:
image.png
所以他们有着相似的行为,因为在阅读源码时,会有一种感觉,他们都在做同样的事情,其实也确实如此, 他们只是对同一行为有着不同的重写.
大家在学习 Tomcat 中,有什么想法,可以和小刀一起分享一下: best396975802

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2298 引用 • 7757 回帖 • 906 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    138 引用 • 516 回帖
回帖   
请输入回帖内容...