由上一章节我们可以知道,Catalina已经教棒给StandardServer了,我们可以直接打开StandardServer类,在打开的时候,我们要留意下static属性以及standardServer的构造方法,这些属性和构造函数的一些赋值在后继的调用中,将会使用到的:
属性如:
private static String exceptions[][] = {
{"org.apache.catalina.core.StandardContext", "available" },
{"org.apache.catalina.core.StandardContext", "configured" },
{"org.apache.catalina.core.StandardContext", "distributable"},
{"org.apache.catalina.core.StandardContext", "name" },
{"org.apache.catalina.core.StandardContext", "override" },
{"org.apache.catalina.core.StandardContext", "publicId" },
{"org.apache.catalina.core.StandardContext","replaceWelcomeFiles" },
{"org.apache.catalina.core.StandardContext","sessionTimeout" },
{ "org.apache.catalina.core.StandardContext","workDir" },
{"org.apache.catalina.session.StandardManager","distributable" },
{"org.apache.catalina.session.StandardManager", "entropy" },
};
构造方法:
public StandardServer() {
super();
ServerFactory.setServer(this);
globalNamingResources = newNamingResources();
globalNamingResources.setContainer(this);
if (isUseNaming()) {
if (namingContextListener == null){
namingContextListener = newNamingContextListener();
namingContextListener.setDebug(getDebug());
addLifecycleListener(namingContextListener);
}
}
}
接下来,我们到initialize方法中查看:
public voidinitialize()
throws LifecycleException {
if (initialized)
throw new LifecycleException (
sm.getString("standardServer.initialize.initialized"));
initialized = true;
// Initialize our defined Services
for (int i = 0; i < services.length;i++) {
services[i].initialize();
}
}
从方法里边我们可以知道,根据initialized属性判断是否进行了初始化,如果没有,那么将循环services数组集合,并调用service的初始化方法。
看到这里,大家内心一定会比较复杂,services这个数组集合是怎么来的呢?我们从源码里边看到属性,在实例化的时候,完全没有赋值呀?
private Service services[]= new Service[0];
但是我们在StandardServern类中,找到addService(),是对这个集合进行了操作的:
public voidaddService(Service service) {
service.setServer(this);
synchronized (services) {
Service results[] = newService[services.length + 1];
System.arraycopy(services, 0,results, 0, services.length);
results[services.length] = service;
services = results;
if (initialized) {
try {
service.initialize();
} catch (LifecycleException e) {
e.printStackTrace(System.err);
}
}
if (started && (serviceinstanceof Lifecycle)) {
try {
((Lifecycle)service).start();
} catch (LifecycleException e){
;
}
}
// Report this property change tointerested listeners
support.firePropertyChange("service", null, service);
}
}
那究竟是谁动了我们的services呢?站出来,我保证不打你的,只想瞧瞧!
我们回想下,server.xml的结构,然后我们到Catalina的createStartDigester的方法中去细细看看,哟,你会发现如下代码:
digester.addObjectCreate("Server/Service","org.apache.catalina.core.StandardService","className");
digester.addSetProperties("Server/Service");
digester.addSetNext("Server/Service","addService","org.apache.catalina.Service");
这个时候,你将会恍然大悟啦,原来digester在解析server.xml文件的时候,就动了我们的services啦,创建了一个StandardService实例,通过StandardServer的addService的方法,将这个实例赋值到了services中去咯,这样standardServer进行初始化的动作又交棒给StandarService中去了。
我们做一个小小的总述:
standardserver初始化的时候,给static属性进行了赋值,同时通过Digestar,实例化了standardService,并通过addService方法,给standardService进行了一些属性赋值,如:service.setServer(this),同时调用了sevice的初始化initialize方法
我们根据初始化调用的关系,绘制了下类图如下:
1, Catalina调用start方法的时候,通过createStartDigester方法,创建了server接口实现类StandardServer的实例
2, Digester通过SetServer方法,将StandardServer赋值给了Catalina类的serve属性
3, Catalina调用Server接口的initianlize的方法
4, StandardServer类实现了Server接口initialize的方法,并利用Digester创建了一个service接口实现类StandardService的实例,并通过addService方法,给相关属性赋值
5, Server调用service接口initianlize方法