你TM写这种东西不烦吗?我也很无奈啊,太懒,只能靠写博客、吹牛逼驱动自己看代码啊。
下面分析每个组件时,只分析它初始化自己的那部分逻辑,其它各种如何调用子组件的逻辑就不一一赘述了。
StandardServer#initInternal
1 | if (getCatalina() != null) { |
你TM写这种东西不烦吗?我也很无奈啊,太懒,只能靠写博客、吹牛逼驱动自己看代码啊。
下面分析每个组件时,只分析它初始化自己的那部分逻辑,其它各种如何调用子组件的逻辑就不一一赘述了。
1 | if (getCatalina() != null) { |
在 Debug 源码的时候发现日志打得特别清晰,容器之间的关系特别清晰,都是这样的形式
1 | StandardEngine[xxx].StandardHost[xxx].StandardContext[xxx].StandardWrapper[xxx] |
看了toString方法后,原来如此。
靠,这 TM 也要写篇博客?这么水?哦,我只是觉得我自己专门去看过这块代码,觉得很有印象。
1 | public String toString() { |
讲真,假如你不幸看到这里了,别往下看了,写得一坨 Shit. 只有我自己能看懂的笔记。讲道理,这种流程,真是一图剩千言,然。。。画图好累的。
主要功能是确定 catalinaHome 和 catalinaBase 两个目录,如果有配置 “catalina.home”/“catalina.base” 这两个 property,就以配置的为准,没有配置就走 fall back,用默认的目录。那么 home 和 base 分别只哪两个目录呢,是用来干嘛的呢。先来看下官方的解释:
Tomcat 里很多组件都实现了生命周期的接口,大到 Server、Service、Engine、Host、Context、Wrapper 这样的关键组件,小到 Connector、Valve 这样的小组件。
Tomcat的整体架构其实和 server.xml 这个配置文件是可以对应起来的。这是一个最简单的但是能用的 server.xml
1 | <?xml version='1.0' encoding='utf-8'?> |
下面是Tomcat的整体架构
最近一段时间看了一遍 Tomcat 8.0 的源代码,略有所得,打算整理一个系列的学习笔记。
Tomcat 源码的工程不是用 Maven 或 Gradle 管理的,使用起来不方便,Github 上有人整理一个 Maven 的工程。我 Fork 了一份。
1 | tomcat8.0-source-research |