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

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的启动核心流程来讲解,还有些具体的实现细节没有介绍到,会在后续的文章中给大家细细到来,欢迎关注收藏哦!

剧情反转,iPhone12Pro小底低像素,相机得高分今天上午,DXO在给iPhone12Pro相机评分之前,发了一条微博并艾特了库克,结合以前的迷之操作,网友对此评价是暗示充值,由于iPhone12Pro本身相机硬件参数就不强,再加时隔5年,小米手机将重新用回2K屏最近关于小米手机的屏幕出现了一些曝光,其表示明年小米将在屏幕上发力,会出现曲面屏四曲屏微曲直屏,而在挖孔上也会出现居中挖孔左上角挖孔以及屏下摄像头量产,而最关键的一点,明年的小米手RedmiNote9Pro上手千元机中的水桶机水桶机指的是一款手机各项均衡,没有明显短板,这种手机常见于旗舰与次旗舰机上,因为设计成本是相对富裕,而这次Redmi的目标是将1500档的千元机做成水桶机,那么在成本如此有限的情况相差300元,Note9标准版和Pro版该如何选择刚刚RedmiNote9系列一连发布了三个版本,其中4G版不谈,两款5G版的价格只相差300元,而这两款机型还是有一些区别的,那么对于Note9和Note9Pro要如何选择,下面来iOS14。2。1更新,并未修复iPhone12绿屏问题最近iPhone12绿屏问题闹的沸沸扬扬,看了一些网友晒的图,与当年华为那次情况很像,都是在摇一摇上翻车,也都出现有的手机绿,有的手机不绿的情况,看了报道苹果表示无需更换硬件,可通小米2020年Q3财报公布,果真是丰收的季节2020年这个秋季,成为小米有史以来最为丰收的季节,722亿的营收远超预期,调整后净利润达到41亿,同比上涨了18。9,所经营的领域也都实现多点开花!智能手机业务第三季度全球466Redmi快充升级,充电缩短13分钟,为Note9铺路今天小白测评发现,RedmiK30Ultra的33W快充,在充电速度上有了提升,其中前半段更加激进,半小时充电提升了17,总充电时长也缩短了13分钟,而这一提升也得到了卢伟冰的证实RedmiNote9系列即将发布,或有4个版本今日小米公布了,RedmiNote系列销量情况,从Note7系列到Note8系列,两代的时间,该系列全球销量达到了1。4亿台,而这一产品线也成为全球爆款之一,从Note7系列4个月5nm处理器再添一员,定位中端,性能仅次于麒麟9000从联发科天玑发布后,中端处理器的性能开始逼近旗舰,对于这种处理器手机厂商都会叫它旗舰级Soc,而今天三星也发布了这样一款处理器,命名Exynos1080,其性能更加接近当下5nm处小米又一款千元机采用联发科处理器Redmi10X海外亮相刚刚,小米Redmi新款机型Redmi10X已经发布在GooglePlay控制台上,并且给出了这款新机的具体参数信息。根据给出参数信息显示,Redmi10X采用了联发科MediaTAirPods系列又多选择再添头戴式和入耳式,高端版本2500元起上周刚刚爆料过有关苹果新款AirPods耳机相关消息,本周又传来了关于AirPods新款产品细节信息,不可否认,苹果AirPods系列产品一直是市场上真无线蓝牙耳机热销产品,给苹果
键盘上F1相信每个用电脑工作的朋友都知道,每个键盘上面都有一排不常用到的按键那就是F1F12,一般情况下在使用键盘时很少在意这些按键,具体有多少人知道这排按键的功能呢?今天就带大家了解下它们手机尽量不要安装这四类软件,只会让手机越来越卡,早知道不吃亏手机尽量不要安装这四类软件,只会让手机越来越卡,早知道不吃亏。第一类手机管家杀毒软件很多人可能会疑惑,为啥明明是可以帮我们清理垃圾的软件,为什么会让手机越来越卡?这些垃圾清理软件对奥睿科床上桌电脑支架体验报告办公利器,懒人福音前些日子不小心摔了脚,导致卧床休养了好一阵子,虽然卧床休养,但工作还是要完成的。所以,笔者只好将电脑移到床上办公,但直接放在床上使用特别的不舒服,索性入手了奥睿科(ORICO)床上为什么1200W像素的苹果,拍照可以吊打一亿像素的安卓机?其他厂商都推出了一亿像素,连最普通的千元安卓机都拥有6400W以上的像素,而苹果依旧坚持1200W像素不变。最奇怪的是,依然有很多人支持苹果的摄像技术,认为它成片即真实又好看,12苹果高端笔记本加速导入mini科创板日报(编辑郑远方),天风国际分析师郭明錤日前表示,苹果正积极引导MacBookPro供应链扩充miniLED面板产能,目标提高2030。另外,20222023年的高端笔记本市鸿蒙加油!谷歌把俄罗斯的安卓禁了,俄企转投中国手机操作系统俄乌开战,美国对俄罗斯的施以史诗级别的疯狂制裁,让全球处于一片危机之中。可有危就有机,这几年来饱受美国制裁与打压的华为,找到了一个对外发展的新机遇。据上观新闻3月27日援引俄罗斯卫日媒称苹果将减产iPhone日本产经新闻28日报道,美国苹果公司计划今年第二季度下调智能手机iPhoneSE系列产量大约20。报道评论,这反映乌克兰局势升级和通货膨胀高企开始削弱消费者电子产品需求。苹果公司不首批有11村加入!区块链数字乡民藏品上线钱江晚报小时新闻记者祝瑶近日,河南河北和湖北三省11个村委会入驻数字乡民项目,上线链上数字乡民艺术卡,推介当地乡村特色和风光。目前,这些数字藏品正在阿里拍卖上拍卖,用户在手机淘宝A消息称苹果对AirPods耳机砍单将今年全年产量调降逾1000万组消息称苹果对AirPods耳机砍单将今年全年产量调降逾1000万组财联社3月28日电,据日经新闻引述消息人士报道,苹果对AirPods耳机砍单,将今年全年产量调降逾1000万组,原苹果向重要员工派发特别挽留奖,最高20万美元记者周姝祺编辑硅谷的科技巨头们正为了挽留人才动用薪能力。近日,据彭博社报道,有知情人士透露,苹果公司正在向少数工程师派发新一轮特别股票红利,作为留住关键人才不同寻常举措中的一项。知北方稀土预计一季度净利同比增96。783月28日晚间,北方稀土公告,预计2022年第一季度归母净利将增加7。5亿元到9。5亿元,同比增加96。78到122。59。公告称,2022年以来,新能源汽车风电绿色家电等领域发展