tomcat源码研读笔记—tomcat的初始化之一 StandardServer的初始化

本文详细介绍了Tomcat中StandardServer的初始化步骤,包括static属性的赋值、构造方法的作用以及initialize方法的执行流程。在StandardServer的初始化过程中,services数组的填充是一个关键点,这一过程在server.xml解析时由digester完成,创建并添加StandardService实例。通过类图展示了Catalina、StandardServer和服务之间的初始化调用关系。
摘要由CSDN通过智能技术生成

由上一章节我们可以知道,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方法

 

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值