tomcat源码解读一 Digester的解析方式

1    Digester

Digester在tomcat中的作用是对conf下的server.xml文件进行实例化,其是从Catalian这个组件开始,创建Digester实例,再添加对应的规则,然后将其实例化,通过setServer方法,将其实例话的对象作为当前Catalian实例的句柄。这样就实现了对象句柄之间的关联引用,从而实现整个平台的递进启动。

 

1.1    UML类图

1.2    UML时序图

 

1.3    规则添加解析

1.3.1  添加对应解析规则

规则的添加实在Catalia.java的load()方法之中。规则主要是根据各个标签创建对应对象的规则,以及解析对象的通过何种方法设为相应句柄属性。其主要实现过程是创建Digester实例,设置规则

 

protected Digester createStartDigester() {
    long t1=System.currentTimeMillis();
    //创建一个digester实例
    Digesterdigester = new Digester();
    //是否需要验证xml文档的合法性,false表示不需要进行DTD规则校验
    digester.setValidating(false);
    //是否需要进行节点设置规则校验
    digester.setRulesValidation(true);
    //将xml节点中的className作为假属性,不用调用默认的setter方法
    //在解析时,调用相应对象的setter方法来设置属性值,setter的参数就是节点属性,
    //而有className的话,则直接使用className来直接实例化对象
    HashMap<Class<?>,List<String>> fakeAttributes = new HashMap<>();
    ArrayList<String> attrs = new ArrayList<>();
    attrs.add("className");
    fakeAttributes.put(Object.class, attrs);
   digester.setFakeAttributes(fakeAttributes);
    digester.setUseContextClassLoader(true);

    //遇到xml中Server节点,就创建一个StandardServer对象注意在这里只是添加了这个规则
    digester.addObjectCreate("Server",
                             "org.apache.catalina.core.StandardServer",
                             "className");

    //根据Server节点中的属性信息,调用属性的setter方法,比如说server节点中会有port=“8080”属性,则会调用setPort方法
    digester.addSetProperties("Server");

    //在上面的load方法中有个digester.push(this),this对象就是栈顶了
    //这里将Server节点对应的对象作为参数,调用this对象,也就是Catalina对象的setServer方法
    //意思即将addObjectCreate 在解析后的对象通过this在digester.push(this)中通过setServer方法注入当前server对象
    //注意这里只是添加规则
    digester.addSetNext("Server",
                        "setServer",
                        "org.apache.catalina.Server");

    //Server节点下的GlobalNamingResources节点,创建一个NamingResource对象
    digester.addObjectCreate("Server/GlobalNamingResources",
                             "org.apache.catalina.deploy.NamingResourcesImpl");
    digester.addSetProperties("Server/GlobalNamingResources");
    digester.addSetNext("Server/GlobalNamingResources",
                        "setGlobalNamingResources",
                        "org.apache.catalina.deploy.NamingResourcesImpl");

    //Server下的Listener节点
    digester.addObjectCreate("Server/Listener",
                             null, // MUST bespecified in the element
                             "className");
    digester.addSetProperties("Server/Listener");
    digester.addSetNext("Server/Listener",
                        "addLifecycleListener",
                        "org.apache.catalina.LifecycleListener");
    //Server下的Service节点

    digester.addObjectCreate("Server/Service",
                             "org.apache.catalina.core.StandardService",
                             "className");
    digester.addSetProperties("Server/Service");
    digester.addSetNext("Server/Service",
                        "addService",
                        "org.apache.catalina.Service");

    //Service节点下的Listener节点
    digester.addObjectCreate("Server/Service/Listener",
                             null, // MUST bespecified in the element
                             "className");
    digester.addSetProperties("Server/Service/Listener");
    digester.addSetNext("Server/Service/Listener",
                        "addLifecycleListener",
                        "org.apache.catalina.LifecycleListener");

    //Executor节点
    digester.addObjectCreate("Server/Service/Executor",
                     "org.apache.catalina.core.StandardThreadExecutor",
                     "className");
    digester.addSetProperties("Server/Service/Executor");

    digester.addSetNext("Server/Service/Executor",
                        "addExecutor",
                        "org.apache.catalina.Executor");

    //给Connector添加规则,就是当遇到Connector的时候,会调用ConnectorCreateRule里面定义的规则
    //跟上面的作用是一样的,只不过该节点的规则比较多,就创建一个规则类
    digester.addRule("Server/Service/Connector",
                     new ConnectorCreateRule());
    digester.addRule("Server/Service/Connector",
                     new SetAllPropertiesRule(new String[]{"executor"}));
    digester.addSetNext("Server/Service/Connector",
                        "addConnector",
                        "org
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值