前面讲解到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. c# word 转pdf 导出失败,因为此功能尚未安装

    savePDF应该是office2007以上的版本才支持的,而且必须是完整版的office. 如果2007提示这个错误,还需要安装一个插件 http://download.microsoft.com/ ...

  2. Qt字符串类——2. 查询字符串数据

    (1)函数QString::startsWith()判断一个字符串是否以某个字符串开头.此函数具有两个参数,第一个参数指定了一个字符串,第二个参数指定是否大小写敏感(默认情况下,是大小写敏感的),例如 ...

  3. centos 修改网卡名为eth0

    centos7和centos6的命名规则不同,centos6网卡名由udev控制 网卡名以eth开头然后第一块网卡叫eth0第二块网卡叫eth1,然后centos7的网卡命名规则截然不同 centos ...

  4. [BS-28] iOS中分页的几种算法

    iOS中分页的几种算法 总记录数:totalRecord 每页最大记录数:maxResult 算法一: totalPage = totalRecord % maxResult == 0 ? total ...

  5. Performance Analyzer Tool

    PAL工具的使用大同小异,网上看到这篇文章挺不错的,直接翻译过来.如果你在过去有Exchange性能问题,你肯定知道有很多可变因素会影响Exchange整体性能,有时需要很长的时间才能找到问题的根源, ...

  6. Python2.7的安装

    >登录python官网下载python2.7的相关版本 python官网链接 >根据平台选择相应的版本 >下载完毕后点击安装即可 >配置环境变量 >安装成功

  7. Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解

    在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...

  8. 4Web Service中的几个重要术语

    4.1WSDL: web service definition language 直译:Webservice定义语言 1.对应一种类型的文件.wsdl 2.定义了webservice的服务端与客户端应 ...

  9. 从表中删除重复记录的sql

    --有一个表,假设是这样的 CREATE TABLE Test ( field1 ) primary key, field2 )); --假设field1上有索引. 要删除表中所有field1重复的记 ...

  10. bitcask

    Bitcask模型是一种日志型kv模型.所谓日志型,是指它不直接支持随机写入,而是像日志一样支持追加操作.Bitcask模型将随机写入转化为顺序写入. 任意时刻,系统中只有一个数据文件支持写入,称为a ...