前面讲解到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. Geolocation

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. mysql-四舍五入

    四舍五入:1.format函数:select FORMAT(2.567,2); 返回:2.57select FORMAT(12562.6655,2); 返回:12,562.67 //整数部分超过三位的 ...

  3. Git add 常见用法

        Git add   git add [参数]  [--] <路径> //作用就是将我们需要提交的代码从工作区添加到暂存区,就是告诉git系统,我们要提交哪些文件,之后就可以使用gi ...

  4. WebSocket IO和后端建立长连接,即时接受后端消息

    https://github.com/TooTallNate/Java-WebSocket ant得到java_websocket.jar改名为WebSocket.jar放到 https://gith ...

  5. C# 控制台程序(命令行程序)设置字体颜色,窗口宽高,光标行数

    控制台程序(命令行程序)设置窗口宽度高度,如下代码: Console.WriteLine(Console.WindowHeight); Console.WriteLine(Console.Buffer ...

  6. c# 中几个关于string问题

    1.string是一个应用类型,而不是值类型:为什么用起来很像值类型?因为微软对其做了特殊处理. 2. using System; namespace testForString { class Pr ...

  7. n皇后2种解题思路与代码-Java与C++实现

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了n皇后问题的解题思路,并分别用java和c++实现了过程,最后,对于算法改进 ...

  8. LaTeX插入图表方法 Lists of tables and figures

    Lists of tables and figures A list of the tables and figures keep the information organized and prov ...

  9. Ubuntu 12.04安装vim和配置

    问题: ubuntu默认没有安装vim,出现: jyg@ubuntu:~$ vim test.cThe program 'vim' can be found in the following pack ...

  10. SpringMvc处理JSON

    步骤如下: 1.加入jar包 2.编写目标方法,使其返回JSON对应的对象或集合 3.在方法上添加@ResponseBody注解 DispatcheServlet默认装配RequestMappingH ...