| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 拆解Tomcat10: (五) 核心组件的协调控制与设计模式解析 -> 正文阅读 |
|
[Java知识库]拆解Tomcat10: (五) 核心组件的协调控制与设计模式解析 |
系列文章目录拆解Tomcat10: (一) 如何快速的学习一门新的语言 文章目录前言上一篇《拆解Tomcat10: (四) 图解架构》分享了Tomcat的核心组件及其架构关系,本章接着讲解组件的Tomcat的初始化过程,这么多组件是如何统一加载、启动的。这其中用到了哪些设计模式和设计原则。 一、Server的初始化在 1. 总览生命周期接口的实现方式下图在上一篇图二的基础上补充了实现逻辑,见下图中的紫色部分(仅用于展示结构关系,未画所有Lifeycle相关组件):
在Lifeycle接口中,定义了初始化(init)、启动(start)、停止(stop)、销毁(destory)、获取当前状态(getState)等方法,从Lifeycle的名字也可以知道,这个接口用于定义对象的生命周期,即生老病死的过程。
2. 通用抽象类直接实现Lifeycle接口的是LifecycleBase类,这是一个抽象类。以其实现init()方法为例:
在LifecycleBase类中有两个对应的init相关方法,首先init()方法Override父类的方法,通过setStateInternal方法触发相应状态的事件(具体后文描述,不是此处重点),然后调用另一个抽象方法initInternal()。 3. 子类的实现逻辑这里预留的initInternal()方法是做什么用的呢,看一下StandardServer类中对此方法的具体实现:
可以看到这里是具体Server相关的代码,也就是说,initInternal()是预留给子类实现的,由子类通过重写此方法来实现自己的个性逻辑。 为什么要这样设计呢?这就是模板方法模式。 二、☆模板方法模式(TEMPLATE METHOD)
结合上一节的例子:
1. 总结一下模板方法模式适用的场景:
2. 模板方法模式的好处:
类图如下:
这也是非常惯例的一种实现方式,如果一个接口会被多个不同类实现,那么常见的操作就是使用一个类去实现这个接口,在这个实现类中编写通用的方法,并调用需要子类实现的抽象方法。子类直接或间接继承这个抽象类,并根据自身需要实现具体逻辑。 三、所有核心组件的Init方法传递继续上一篇的Catalina类的load()方法,此时完成了对Server.xml文件的解析,并将其赋值给了Catalina的server属性。接下来就是调用 看一下第一节中StandardServer类的initInternal()方法的代码,在最后一部分通过循环遍历的方式调用了所有Service的init方法。
同理,由图一可知,Service同样是继承了LifecycleBase类,所以Service和Server的上层通用逻辑是一样的,那么看一下StandardService的initInternal()方法:
其中进行了Engine、Executors、mapperListener、Connectors的初始化,以此类推,其他的组件的initInternal()方法我们就不逐一研究了,因为此处暂不关心这几个组件的功能,仅关注组件之间的关系和调用逻辑。具体每个组件的功能及处理逻辑在单独学习该组件的时候再进行分析。 大概流程如下(只画了部分组件):
四、 总体的调用流程通过init方法的例子,我们可以大概明白Tomcat的这些核心组件之间的初始化流程。其实对于Lifecycle接口的其他生命周期方法也是类似的,启动(start)、停止(stop)、销毁(destory)等方法也是这样从根节点逐级传递到叶子节点的。也同样存在对应的startInternal()、stopInternal()、destroyInternal()方法。 当然,并不是每个组件都会重写这些实际的生命周期方法 XXXInternal(), 比如 StandardHost就没有重写 initInternal()方法,但重写了startInternal()方法。 这完全由按照逻辑需要决定,反过来说,这也给后期逻辑扩展预留了位置。 所以,对于Tomcat的启动停止等操作,实际上逻辑是这样的:
五、 Bootstrap、Catalina与组件的生命周期方法的对应关系用户对Tomcat发出Start、Stop等指令,Tomcat的Bootstrap中的main方法接到对应的指令参数后,通过反射方式调用Catalina的对应方法,再由Catalina调用Server的对应方法。至此,这个核心组件树由根部开始逐步调用下一级的对应方法,直至叶子节点。 用户指令参数、Catalina的方法以及核心组件的生命周期方法的对应关系如下图:
总结通过本文我们总览了核心组件之间的关系以及逐级调用的逻辑。也以此为例学习了一个设计模式:模板方法模式。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 7:40:25- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |