Tomcat源码二:执行init()方法、start方法

版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在页面明显位置给出原文链接。 https://blog.csdn.net/mengxiangqihangz/article/details/88419166

init() 方法

start() 方法

StandardService 的start()方法
根据server.xml 可以知道service中配置了 executor(我把注释去掉)、connector、engine
在这里插入图片描述

engine

在这里插入图片描述
在之前的rules(建议打印出来)中,指定了StandardEngine

  • StandardService 的 startInternal()

在这里插入图片描述
此处的container 即为StandardEngine的实例

  1. StandardEngine
    先解决 standardEngine的 realm和children(子容器)两个属性,由哪个类实现的问题
    在这里插入图片描述
    通过xml解析的时候,为standardEngine 指明了 realm的实现类,和Host的实现类(与standardservice 指定standardEngine一样,都是通过rules 默认绑定的。
[
ObjectCreateRule[className=org.apache.catalina.core.StandardHost, attributeName=className], 
SetPropertiesRule[], 
org.apache.catalina.startup.CopyParentClassLoaderRule@4e2120fa, 
org.apache.catalina.startup.LifecycleListenerRule@60fc2528, 
SetNextRule[methodName=addChild, paramType=org.apache.catalina.Container]
]

如上所示的rules。说明host的属性,是通过addChild的方法,保存到children 属性中

  • 另一个重要的属性 pipeline
    默认为 StandardPipeline
    pipeline的setBasic 方法调用图
    在这里插入图片描述
    也就是说。 StandardContext、StandardEngine、StandardHost、StandardWrapper 的basic 属性,都是在创建这些容器的时候,set进去的。
    分别为 StandardContextValve、StandardEngineValve、StandardHostValve、StandardWrapperValve
    在这里插入图片描述
    而如上图,StandardHost add 了一个 AccessLogValve
    形成了 AccessLogValve (next) --> StandardHostValve
    而在启动StandardHost的时候 又为 AccessLogValve StandardHostValve 中间插入了一个ErrorReportValve
    变成了 AccessLogValve --> ErrorReportValve --> StandardHostValve
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mengxiangqihangz/article/details/88419166