标签:解析 doc instance strong 注册表 post handler util register
上一回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()方法解释
准备组件启动。此方法应执行任何初始化所需的后期对象创建。
以下生命周期事件将按以下顺序触发:
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()之前。
这个方法将Component实例注册到LifecycleMBeanBase
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是怎么来了,可以看到
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的启动
标签:解析 doc instance strong 注册表 post handler util register
原文地址:http://www.cnblogs.com/gne-hwz/p/7724669.html