1. 程式人生 > >tomcat啟動(四)Catalina分析-server的啟動

tomcat啟動(四)Catalina分析-server的啟動

let .get names present and 接下來 server set public

上一回load()方法解析講到xml解析完成。

load()內部接下來會獲取server

getServer().setCatalina(this);

這個server從createStartDigester()方法中可以看出

digester.addObjectCreate("Server",
                                 "org.apache.catalina.core.StandardServer",
                                 "className");

從上面知道我們獲取的server是

org.apache.catalina.core.StandardServer

1、接著執行Server.init方法

getServer().init();
看StandardServer類的關系
public final class StandardServer extends LifecycleMBeanBase implements Server
ζ

public abstract class LifecycleMBeanBase extends LifecycleBase
ζ

public abstract class LifecycleBase implements Lifecycle

Lifecycle.init()方法解釋

準備組件啟動。此方法應執行任何初始化所需的後期對象創建。
以下生命周期事件將按以下順序觸發:
  1. INIT_EVENT: On the successful completion of component initialization成功完成組件初始化

2、由LifecycleBase重寫其init()方法,方法裏主要調用initInternal方法。這個方法是抽象方法

initInternal();

3、LifecycleMBeanBase重寫initInternal()方法

@Override
    
protected void initInternal() throws LifecycleException { // If oname is not null then registration has already happened via // preRegister(). if (oname == null) { mserver = Registry.getRegistry(null, null).getMBeanServer();
獲取註冊表,返回MBeanServer instance實例 oname
= register(this, getObjectNameKeyProperties()); } }
register(this, getObjectNameKeyProperties());
這個方法使子類輕松地註冊。不使用MBeanServer實現JmxEnabled的其他組件。
註意:只有在initInternal()被調用之後才能使用此方法,並且在調用destroyInternal()之前。
.LifecycleMBeanBase.register(Object obj, String objectNameKeyProperties) obj:向這個對象註冊 objectNameKeyProperties:用於註冊對象的對象名稱的關鍵屬性組件

這個方法將Component實例註冊到LifecycleMBeanBase

4、StandardServer.initInternal()

super.initInternal();
// Register global String cache
        // Note although the cache is global, if there are multiple Servers
        // present in the JVM (may happen when embedding) then the same cache
        // will be registered under multiple names
        onameStringCache = register(new StringCache(), "type=StringCache");
// Register the MBeanFactory
        MBeanFactory factory = new MBeanFactory();
        factory.setContainer(this);
        onameMBeanFactory = register(factory, "type=MBeanFactory");
// Register the naming resources
        globalNamingResources.init();

// Initialize our defined Services
        for (int i = 0; i < services.length; i++) {
            services[i].init();
        }

至於這個services是怎麽來了,可以看到

tomcat啟動(三)Catalina分析-load方法分析這篇文章中的

一、createStartDigester()

digester.addObjectCreate("Server/Service",
                                 "org.apache.catalina.core.StandardService",
                                 "className");
這個方法會將Digester綁定到Rule,當開始執行匹配到與pattern相同的元素標簽名時,這裏指匹配到<Server>標簽時就會調用rule.begin()創建相應對象,然後將對象綁定到digester

當調用Digester.parse()解析xml文檔時,XMLReader發送廣播到ContentHandler接口進行文檔解析

調用到Digester.startElement()時會獲取UrlClassLoader中定義的rule(也就是我們CreateStartDigester()方法中增加的rule)

然後執行rule.begin()方法將創建的StandardService綁定到Digester即Digester類中的services變量中

接下來開始執行StandardService.init()

tomcat啟動(四)Catalina分析-server的啟動