tomcat啟動(四)Catalina分析-server的啟動
阿新 • • 發佈:2017-10-25
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()方法解釋
準備組件啟動。此方法應執行任何初始化所需的後期對象創建。
以下生命周期事件將按以下順序觸發:
- INIT_EVENT: On the successful completion of component initialization成功完成組件初始化
2、由LifecycleBase重寫其init()方法,方法裏主要調用initInternal方法。這個方法是抽象方法
initInternal();
3、LifecycleMBeanBase重寫initInternal()方法
@Overrideprotected 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的啟動