Tomcat server.xml的加载过程

跟踪Tomcat的启动过程,可以发现是在Catalina调用load方法时对server.xml进行加载的

观察Catalina的load方法

load() -> createStartDigester()
       -> configFile()
       -> digester.push(this)
       -> digester.parse()

tomcat使用digester来帮助解析server.xml,digester内部是使用saxparser来解析的,是基于流的解析,边读边解析,可以制定规则,使得在解析过程遇到特定元素做相应操作。

(1)createStartDigester方法创建digest规则
addObjectCreate/addSetProperties/addSetNext/addRuleSet实际都相当于在addRule
Rule接口有begin/body/end/finish等方法,分别在开始读某个元素,结束读某个元素时调用。

  • addObjectCreate:遇到元素时创建
  • addSetProperties:遇到元素时将元素的属性设置到对象里
  • addSetNext:调用父类的方法设置子元素

(2)configFile方法以常量”conf/server.xml”作为路径获取server.xml文件对象

(3)将Catalina传入digester
将Catalina设为根元素,使得server可以通过setServer设置到Catalina里。

(4)将xml文件转化为对象并设置到Catalina里
在遇到元素时,将会创建对象,在元素结尾时,将把元素设置到父级元素中。所以生成顺序是从父到子,设置顺序是从子到父。

注意:

(1)Engine设置Host,或者Host设置Context时使用的是addChild方法,在addChild方法中,会启动child,所以在tomcat刚开始启动读取server.xml时就会加载好web应用。

(2)观察Host的RuleSet和Context的RuleSet可知,会为Host注入HostConfig(Listener),为Context注入ContextConfig(Listener),无需在server.xml中声明

猜你喜欢

转载自blog.csdn.net/lblblblblzdx/article/details/80946319