前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tomcat学习|Tomcat应用各个组件的默认值

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

作者头像
微笑的小小刀
发布2019-08-20 11:34:26
6240
发布2019-08-20 11:34:26
举报

开头说两句

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

学习背景

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

组件的默认值

Server->StandardServer Service->StandardService Executor->StandardThreadExecutor(tomcat里面的线程池实现,为所有的Service所共用) Connector->new Connector(attributes.getValue(“protocol”)); 在EngineRuleSet中,我们可以看到和Engine相关的一系列的初始化

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 , 如下图所示

同时也都有着完整的生命周期:

所以他们有着相似的行为,因为在阅读源码时,会有一种感觉,他们都在做同样的事情,其实也确实如此, 他们只是对同一行为有着不同的重写. 大家在学习tomcat中,有什么想法,可以和小刀一起分享一下: best396975802

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java技术大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开头说两句
  • 学习背景
  • 组件的默认值
  • tomcat中的类加载器
  • 最后说两句
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档