前面讲解到Tomcat中使用Digester框架进行server.xml到javaBean对象的映射,这篇文章以Connector的SSL通道为例,来讲解Connector的属性是如何注入的。

先看一下SSL的配置:


1.Connector的Digester配置
前面已经源码分析过,在启动包中Bootstrape类会首先反射到Catalina类进行Digester的装配:

回顾前面的Digester学过的内容,addRule方法是为Digester解析到xml对应位置时,如何进行操作的规则定义。
ConnectorCreateRule源自于CreateRule,是Connector对象初始化的时候,进行什么操作。
SetAllPropertiesRule源自于SetPropertiesRule,是Connector对象创建完成,设置什么属性时,进行什么操作。
上面的两条rule,是Connector基于Digester默认的Rule自定义实现的,所以需要通过addRule方法进行加入。

最后一个rule是setNext,这条规则是Digester默认的规则,将当前的Connector对象加到整个解析树中,相当于addChild。

下面重点分析ConnectorCreateRule,和SetAllPropertiesRule这两个Rule。

2.ConnectorCreateRule

如果需要实现Rule,那么就需要了解Rule的生命周期:

ConnectorCreateRule对于begin方法进行了定制,如果没有定制,那么默认初始化Connector的时候,调用Connector的无参的构造方法。
但是对于连接器的结构来讲,其Tomcat的实现逻辑是,根据不同的http协议给Connector传入不同的参数,这个需要在对象构造的时候就应该确定,也就是说我们应该调用的是下面的构造方法:

对于Http/1.1协议来讲,应该反射出来的就是Http11Protocol类,然后实例化这个类并设置到Connector属性中去。
如果想完成上述的动作,那么默认的ObjectCreateRule就不好使了,需要进行自定义,这就是ConnectorCreateRule的实现了:

3.SetAllPropertiesRule

Connector的属性定义非常的多,但是SSL的属性却没有定义在Connector类中:

这是因为很多的属性和对应的协议和通道相关,属性全部设置在Connector中是不合适的,Tomcat将协议抽象为HttpxxxProtocol这样的类,通道抽象成xxxEndpoint这样的类,这些属性应该设置到这些类中去。
要想满足上述的需求,又需要对Digester的默认的Rule进行修改了,这回修改的是SetPropertiesRule,默认的SetPropertiesRule,遇到xxx属性,会自动反射调用setXxx()方法,进行设置属性。
看看Connector的SetAllPropertiesRule,这个Rule是自定义的,还是来看看begin方法:

当Connector实例构造完毕之后,遍历server.xml中配置的Connector的属性集合,代理给IntroSpectionUtil类的setProperties方法进行设置属性。
对于这个IntroSpectionUtil类是一个工具类,其实现思路还是反射,但是这个类的好处是放出了一个回调,也就是在代理设置属性的过程中,如果Connector类定义了setProperty方法,会尝试的调用Conector的setProperty,如果没有定义setProperty方法的话,默认还事对Connector对象的属性进行设置。
而从代码中可以看到,Conector的setProperty实际上把最终设置的属性转给了协议Handler:
这样,我们就不难发现,其这些SSL属性最终都是设置在Http11Protocol中:


4.xxxEndpoint

比较有意思的是,对于Http1.1协议,SSL这些属性最终也并没有设置到这个Http11Protocol类中,而是继续进行委托,将这些属性最终设置到协议关联的通道中,xxxEndPoint就是所谓的通道,对于NIO来将,就是NIOEndPoint,对于BIO来讲,就是JIOEndpoint。

整体的类图为:

相当于关于SSL的属性设置到了,上面的Endpoint中了。


总结:
本节以一个Connector实例表明,Digester如何进行扩展默认的Rule,来定制server.xml中的配置到javaBean的这样的一个过程,可以看到整个过程中,将Tomcat容器的逻辑加入了进来,这样在容器点火和初始化之前,很多属性就已经设置成功了。





b.Connector配置解析的更多相关文章

  1. NGINX(四)配置解析

    前言 nginx配置解析是在初始化ngx_cycle_t数据结构时,首先解析core模块,然后core模块依次解析自己的子模块. 配置解析过程 nginx调用ngx_conf_parse函数进行配置文 ...

  2. nsq源码阅读笔记之nsqd(一)——nsqd的配置解析和初始化

    配置解析 nsqd的主函数位于apps/nsqd.go中的main函数 首先main函数调用nsqFlagset和Parse进行命令行参数集初始化, 然后判断version参数是否存在,若存在,则打印 ...

  3. configparser_配置解析器

    configparser:配置解析器 import configparser config = configparser.ConfigParser() #配置文件 config[', 'Compres ...

  4. spring+mybaits xml配置解析----转

    一.项目中spring+mybaits xml配置解析 一般我们会在datasource.xml中进行如下配置,但是其中每个配置项原理和用途是什么,并不是那么清楚,如果不清楚的话,在使用时候就很有可能 ...

  5. DNS Bind服务配置解析

    DNS域名解析服务(Domain Name System)是用于解析域名与IP地址对应关系的服务,功能上可以实现正向解析与反向解析: 一.DNS服务器工作模式分类: 1.主服务器:在特定区域内具有唯一 ...

  6. 初识nginx——配置解析篇

    一.nginx的介绍 nginx是由俄罗斯人开发的一款高性能的http和反向代理服务器,也可以用来作为邮件代理.相比较于其他的服务器,具有占用内存少,稳定性高等优势 二.nginx的配置 nginx的 ...

  7. Apache入门 篇(二)之apache 2.2.x常用配置解析

    一.httpd 2.2.x目录结构 Cnetos 6.10 YUM安装httpd 2.2.x # yum install -y httpd 程序环境 主配置文件: /etc/httpd/conf/ht ...

  8. OK335xS 系统启动配置解析

    OK335xS 系统启动配置解析 一.参考文档: AM335x ARM® Cortex™-A8 Microprocessors (MPUs) Technical Reference Manual 二. ...

  9. Mybatis源码解析,一步一步从浅入深(三):实例化xml配置解析器(XMLConfigBuilder)

    在上一篇文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码 ,中我们看到 代码:XMLConfigBuilder parser = new XMLConfigBuilder(read ...

随机推荐

  1. 构建Logstash+tomcat镜像(让logstash收集tomcat日志)

    1.首先pull logstash镜像作为父镜像(logstash的Dockerfile在最下面): 2.构建my-logstash镜像,使其在docker镜像实例化时,可以使用自定义的logstas ...

  2. Android应用程序窗口(Activity)与WindowManagerService服务的连接过程分析

    在前两文中,我们分析了Activity组件的窗口对象和视图对象的创建过程.Activity组件在其窗口对象和视图对象创建完成之后,就会请求与WindowManagerService建立一个连接,即请求 ...

  3. 使用MapReduce实现一些经典的案例

    在工作中,很多时候都是用hive或pig来自动化执行mr统计,但是我们不能忘记原始的mr.本文记录了一些通过mr来完成的经典的案例,有倒排索引.数据去重等,需要掌握. 一.使用mapreduce实现倒 ...

  4. 12个css高级技巧.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. listener.ora增加监听端口

    一个简单的listener.ora # listener.ora Network Configuration File: d:\app\zyd\product\11.2.0\dbhome_1\netw ...

  6. 一面cvte

    昨天上午去cvte参加一面,和好基友一块,离学校很近,10点多一点到了,一出电梯,傻眼了(不是美女很多),是人真的很多,等了2个小时才轮到我们,一个hr面3个人,我和基友,还有一个本科小盆友,问了5个 ...

  7. Java 泛型和通配符解惑

    转自:http://www.linuxidc.com/Linux/2013-10/90928.htm T  有类型 ?  未知类型 一.通配符的上界 既然知道List<Cat>并不是Lis ...

  8. PHP计算时间差,并返回什么时间之前发表的内容

    <?php header("Content-type: text/html; charset=utf-8"); function time2Units ($time){ $y ...

  9. find函数

    Python find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1. ...

  10. Shell基本功能&配置&Oh-My-Zsh

    http://blog.csdn.net/yangcs2009/article/details/45720193