前面讲解到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. 解决 git 中文路径显示 unicode 代码的问题

    解决 git 中文路径显示 unicode 代码的问题 当被修改的文件中带有中文字符时,中文字符会被转换为 unicode 代码,看不出原来的文件名. 这时,只要配置 :: git config -- ...

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

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

  3. The tag 'DataGridTextColumn' does not exist in XML namespace ....

    错误 10 The tag 'DataGridTextColumn' does not exist in XML namespace 'http://schemas.microsoft.com/win ...

  4. windows系统调用 semaphore信号量

    #include "iostream" #include "windows.h" #include "cstring" using name ...

  5. 修改 window.setTimeout,使之可以传递参数和对象参数

    /* 功能:修改 window.setTimeout,使之可以传递参数和对象参数 使用方法: setTimeout(回调函数,时间,参数1,,参数n) */ var _setTimeout=setTi ...

  6. VS2010 支持 CSS3

    在安装Standards Update for VS2010 SP1后,VS2010中没有CSS3.0问题,以下是我的解决方法 1.首先去官网下载 CSS 3 Intellisense Schema ...

  7. android第三方登陆

    实现QQ.微信.新浪微博和百度第三方登录(Android Studio) 前言: 对于大多数的APP都有第三方登录这个功能,自己也做过几次,最近又有一个新项目用到了第三方登录,所以特意总结了一下关于第 ...

  8. vs2005水晶报表无法运行在X64机器上

    要下载补丁:CRRedist2005_X64.msi http://download.csdn.net/download/gcy007/7106933

  9. 关于Unity四元数相乘先后顺序的问题

    在unity中四元数和向量相乘在unity中可以变换旋转.四元数和四元数相乘类似矩阵与矩阵相乘的效果. 矩阵相乘的顺序不可互换,只有特殊条件矩阵才可互换.四元数相乘类似,今天就因为这个问题掉进坑里了, ...

  10. 浅谈 PHP 与手机 APP 开发(API 接口开发)

    本文内容转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人一.先简单回答两个问题:1.PHP 可以开发客户端?答:不可以, ...