范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Tomcat源码篇简单到超乎想象的启动流程

  image.png  Tomcat的启动核心流程
    前面给大家介绍了Tomcat中的生命周期的设计,掌握了这块对于我们分析Tomcat的核心流程是非常有帮助的,也就是我们需要创建相关的核心组件,比如Server,Service肯定都绕不开生命周期的方法。
  image.png  1.启动的入口
    你可以通过脚本来启动Tomcat服务(startup.bat),但如果你看过脚本的命令,你会发现最终调用的还是Bootstrap中的main方法,所以我们需要从main方法来开始
  image.png
    然后我们去看main方法中的代码,我们需要重点关注的方法有三个  bootstrap.init()方法  load()方法  start()方法
    也就是在这三个方法中会完成Tomcat的核心操作。  2.init方法
    我们来看下init方法中的代码,非核心的我们直接去掉      public void init() throws Exception {         // 创建相关的类加载器         initClassLoaders();         // 省略部分代码...         // 通过反射创建了 Catalina 类对象         Class<?> startupClass = catalinaLoader             .loadClass("org.apache.catalina.startup.Catalina");         // 创建了 Catalina 实例         Object startupInstance = startupClass.getConstructor().newInstance();          // 省略部分代码...         String methodName = "setParentClassLoader";         Class<?> paramTypes[] = new Class[1];         paramTypes[0] = Class.forName("java.lang.ClassLoader");         Object paramValues[] = new Object[1];         paramValues[0] = sharedLoader;         // 把 sharedLoader 设置为了 commonLoader的父加载器         Method method =             startupInstance.getClass().getMethod(methodName, paramTypes);         method.invoke(startupInstance, paramValues);          // Catalina 实例 赋值给了 catalinaDaemon         catalinaDaemon = startupInstance;     } 首先是调用了initClassLoaders()方法,这个方法会完成对应的ClassLoader的创建,这个比较重要,后面专门写一篇文章来介绍。  通过反射的方式创建了Catalina的类对象,并通过反射创建了Catalina的实例  设置了类加载器的父子关系  用过成员变量catalinaDaemon记录了我们创建的Catalina实例
    这个是通过bootstrap.init()方法我们可以获取到的有用的信息。然后我们继续往下面看。  3.load方法
    然后我们来看下load方法做了什么事情,代码如下:      private void load(String[] arguments) throws Exception {          // Call the load() method         String methodName = "load"; // load方法的名称         Object param[];         Class<?> paramTypes[];         if (arguments==null || arguments.length==0) {             paramTypes = null;             param = null;         } else {             paramTypes = new Class[1];             paramTypes[0] = arguments.getClass();             param = new Object[1];             param[0] = arguments;         }         // catalinaDaemon 就是在 init中创建的 Catalina 对象         Method method =             catalinaDaemon.getClass().getMethod(methodName, paramTypes);         if (log.isDebugEnabled()) {             log.debug("Calling startup class " + method);         }         // 会执行 Catalina的load方法         method.invoke(catalinaDaemon, param);     }
    上面的代码非常简单,通过注释我们也可以看出该方法的作用是调用 Catalina的load方法。所以我们还需要加入到Catalina的load方法中来查看,代码同样比较长,只留下关键代码      public void load() {          if (loaded) {             return; // 只能被加载一次         }         loaded = true;          initDirs(); // 废弃的方法          // Before digester - it may be needed         initNaming(); // 和JNDI 相关的内容 忽略          // Create and execute our Digester         // 创建并且执行我们的 Digester 对象  Server.xml         Digester digester = createStartDigester();          // 省略掉了 Digester文件处理的代码          getServer().setCatalina(this); // Server对象绑定 Catalina对象         getServer().setCatalinaHome(Bootstrap.getCatalinaHomeFile());         getServer().setCatalinaBase(Bootstrap.getCatalinaBaseFile());          // Stream redirection         initStreams();         // 省略掉了部分代码...          getServer().init(); // 完成 Server  Service Engine Connector等组件的init操作      }
  把上面的代码简化后我们发现这个Load方法其实也是蛮简单的,就做了两件事。  通过Apache下的Digester组件完成了Server.xml文件的解析  通过getServer().init() 方法完成了Server,Service,Engin,Connector等核心组件的初始化操作,这块和前面的LifecycleBase呼应起来了。
  image.png
    如果生命周期的内容不清楚,请看上一篇文章的介绍。  4.start方法
    最后我们来看下start方法的代码。      public void start() throws Exception {         if (catalinaDaemon == null) {             init(); // 如果 catalinaDaemon 为空 初始化操作         }         // 获取的是 Catalina 中的 start方法         Method method = catalinaDaemon.getClass().getMethod("start", (Class [])null);         // 执行 Catalina 的start方法         method.invoke(catalinaDaemon, (Object [])null);     }
    上面的代码逻辑也很清楚,就是通过反射的方式调用了Catalina对象的start方法。所以进入Catalina的start方法中查看。      public void start() {          if (getServer() == null) {             load(); // 如果Server 为空 重新 init 相关的组件         }          if (getServer() == null) {             log.fatal("Cannot start server. Server instance is not configured.");             return;         }          // Start the new server  关键方法--->启动Server         try {             getServer().start();         } catch (LifecycleException e) {             // 省略...         }          // 省略...          // Register shutdown hook  注册关闭的钩子         if (useShutdownHook) {             // 省略...         }          if (await) {             await();             stop();         }     }
    通过上面的代码我们可以发现核心的代码还是getServer.start()方法,也就是通过Server对象来嵌套的调用相关注解的start方法。
  image.png  5.核心流程的总结
  我们可以通过下图来总结下Tomcat启动的核心流程
  image.png
    从图中我们可以看到Bootstrap其实没有做什么核心的事情,主要还是Catalina来完成的。
    本文只是从Tomcat的启动核心流程来讲解,还有些具体的实现细节没有介绍到,会在后续的文章中给大家细细到来,欢迎关注收藏哦!

元宇宙是什么?一分钟了解元宇宙大火的背后,元宇宙近期资本市场最火的概念,什么是元宇宙,简单来说,本质是说对现实世界的虚拟化数字化,追求临场感激,沉浸式体验,要实现这一目标则需要借助vr技术,可以区块链NFT和元宇宙融合的技术与虚无缥缈的未来最近一年,触乐在持续关注虚拟世界的新闻。从区块链到NFT再到元宇宙,包含在其中的概念逐步增多,也更难让人明白其中的原理,如同3团融为一体的毛线,相互纠缠相互利用,充满谜团。到了元宇如何将手机变成无线网卡?感谢邀答根据题主的表达,我认为题主是想让手机变成无线网卡,让台式机等没有无线网卡的设备连接通过连接手机来使用网络,其他答主都是回答了如何用手机充当路由器的作用,我来补充如何让手机变格立空调和海尔空调哪一个比较好?专业空调安装与售后服务多年,回答一下购买空调,国产品牌首选格力!国产空调基本就是格力,海尔,美的,三足鼎立!三家中最好当属格力!美的次之,海尔最后!简单对比一下格力与海尔1,按市场曾经的机皇已跌至冰点价,如今的三星S8还值得买吗?什么叫冰点价呢?我觉得没有最低,只有更低。我个人感觉,三星S系列手机,真的不如note系列好用,但是不得不说,S系列真的很漂亮,特色鲜明。它最大的特色,就是屏幕好,拍照好。我现在用以前没有导航怎么跑长途的?以前没有导航怎么跑长途?深圳市凯立德科技股份有限公司成立于1997年,于1999年开始导航软件的研发,并开发出拥有自主知识产权的导航引擎,2005年获得导航电子地图制作(甲级测绘)为什么现在办理手机号最好使用三个月以上?1利用免费使用的惯性,你可能免费期使用过了之后,忘记注销,然后第四个月,就开始割韭菜了。这个类似你开某视频会员,自动续约功能,不是每个人都忘记,博的是一个概率。2尽可能的占用你的手哪个远程控制软件免费且赶得上teamviewer?TeamViewer在免费的路上已经是越走越窄,几乎已经掉钱眼里边了。不过,在你觉得它的做法令人发指,面目可憎,咬牙切齿之时,它可能也在嫌弃你穷鬼一个,扣扣搜搜,这么好的软件,都不网上被诈骗报案后成功取回的几率有多大?之前看了资料的,大部分诈骗犯在境外,很多也是被境外组织控制犯罪的。很多人被骗过去,然后在那些非法组织的犯罪团伙控制下,按照既定的剧本寻找目标。比如杀猪盘,他们往往是很多人去分析受害如何选择智能电话机器人?现在人工智能电话机器人市场上推出同类型产品的企业已经高达百余家,这发展速度与规模预示着人工智能电话机器人将成为下一个创业新风口。电话机器人咨询15516191220同微智能电话机器翼菲自动化打造国产轻工业机器人一体服务视频加载中导语几名年轻人成立了一家机器人自动化公司,立志做世界级的中国机器人企业。成立短短9年来,依靠持续研发创新,获得国家专利技术近百项,年产值翻了10倍。解说这是平面多关节机器
矿视界之老路闲扯比特币2。3万美元,伊朗币价重回巅峰?1hr早上起床看了一眼币价,小编心中对大家只有一句问候天台上的朋友你们好吗?关于这次暴跌,业界众说纷纭。有人说丝绸之路相关钱包抛售了10万枚BTC导致的9月5号消息,CNBC主持人小K测评第五期迪兰RX5808GXSerial战神这期硬件测评,小K将要为大家介绍迪兰家族又一款集颜值与性能于一身的显卡迪兰RX5808GXSerial战神海力士颗粒(下文统称RX588)。在RadeonRXVEGA系列没有推出之科普入门ETH硬分叉,什么是硬分叉软分叉呢?搜索微信公众号矿视界关注我们在区块链领域,网络分叉可以说是一件大事件了,特别是像比特币以太坊等主流数字货币的网络分叉,往往带来数十上百亿的市值变动,惹人注目。8月24日,以太坊的大奇迹摩尔真正的无盘挖矿系统已正式上线还在用Windows有盘系统挖矿?那你就OUT啦!其实矿机不用硬盘也可以挖矿想了解一下吗?显卡超频一键搞定省时又省力要体验一下吗?以前一千台矿机要雇四五个人管理真的有必要吗?一张显你看天上的白云,像不像我借你的1688元中国有句老话叫有借有还,再借不难,但是现在社会,借钱不还现象反而比较常见。这些欠钱不还的人要么确实是记性不好,忘了要么真没钱还再要么就是老赖,不想还你钱了。等待了许久他都不还钱。不无盘挖矿好处多你家矿机喊你换系统啦之前小编给大家解释了Linux在作为矿机系统方面全面碾压Windows的原因(想要了解的朋友们请戳戳)。文中也说到如果矿场里有大量的矿机想要从Windows系统更换成Linux系统老路闲扯矿机神仙打架,矿工池鱼遭殃虽然中秋都过去了,但最近几天这气温才真正有秋天的感觉啊,很多地方未来几天的昼夜温差都要超过10度了。虽然有的时候是有些冷,不过老路建议大家加衣服时还是要注意,不要一下子加的太多。正矿工入门你必须了解矿池的那些事数字货币挖矿行业发展到现在,挖矿的人越来越多,算力也随之不停增加。像是比特币,以太坊这类市值较高的可挖取数字货币,它们所整合的计算机算力已经是一个非常庞大的数值了。基于发行总量的限矿视界之老路闲扯以太坊将拜占庭分叉?今天已经是8月31日了,明天就是许多学校新一学期开始的日子。不知道大家最近睡觉,有没有梦到那些被上课铃声支配的日子?上学的时候觉得天天早起上课,背书写作业好累,总是盼着下课铃声响起老路闲扯徐明星iPhone上了,割点韭菜买苹果搜索微信公众号矿视界关注我们这几天以太坊跌的是真的难受,好多之前挖以太的矿工朋友不知道是转去挖别的币,还是直接关机了,昨天以太坊全网算力较前天又下跌了5。6Ths,按一台矿机240小米新机曝光,外观造型十分新颖,网友天线宝宝上身?不知道从什么时候开始,智能手机产品之间的竞争已经不再局限于性能拍照等方面了,毕竟现在已经是性能过剩的时代,各种旗舰机型的性能基本上都差不多,比不出太大的差距来。因此,很多智能手机厂