先码后看 Tomcat是怎么启动容器的——Lifecycle篇 侵立删
来源:互联网 发布:linux 云硬盘 挂载 编辑:程序博客网 时间:2024/06/05 06:11
转自:http://blog.csdn.net/dao_wolf/article/details/55050467
Tomcat 8(七)解读Bootstrap介绍过,执行startup.bat,将引发Tomcat一连串组件的启动。其实这一连串启动是通过组件的生命周期(Lifecycle)实现的
今天来看看Lifecycle设计。解读Lifecycle,涉及到如下几个类
Lifecycle、LifecycleState、LifecycleEvent、LifecycleListener(位于org.apache.catalina)
LifecycleBase、LifecycleSupport、LifecycleMBeanBase(位于org.apache.catalina.util)
Lifecycle接口
Lifecycle接口的作用
定义了事件类型(静态常量字符串)
定义了init/start/stop/destroy方法,即组件初始化/启动/停止/销毁
定义了addLifecycleListener/findLifecycleListeners/removeLifecycleListener方法,即添加/获取/移除监听器(监听器主要监听启动、停止动作)
LifecycleState枚举
LifecycleState定义了组件状态的枚举。LifecycleState包含两个属性:available、lifecycleEvent
available(boolean)-处于此状态的组件是否可以执行public方法(get/set方法除外),是否可以获取lifecycleEvent值
lifecycleEvent(String)-处于此状态的组件正进行的事件
LifecycleEvent
LifecycleEvent是个实体类,包含三个属性lifecycle、type、data
lifecycle(Lifecycle)-将触发事件的组件
(注意:每个组件都可以向上转成Lifecycle类型,因为组件继承LifecycleMBeanBase,而LifecycleMBeanBase继承LifecycleBase,而LifecycleBase是Lifecycle的一种实现)
type(String)-事件类型
data(String)-事件数据
LifecycleSupport
LifecycleSupport将组件正在进行的LifecycleEvent通知给监听器(LifecycleListener)
LifecycleListener
监听特定事件,并做出相应处理
AprLifecycleListener(org.apache.catalina.core)就是LifecycleListener的一种实现
组件更新状态时,如果组件当前状态的lifecycleEvent不为空,LifecycleSupport会将 lifecycleEvent通知给LifecycleListener,LifecycleListener会做出相应处理
LifecycleBase
LifecycleBase实现了Lifecycle接口,添加了几个新的方法如setStateInternal(更新组件状态)、fireLifecycleEvent(触发LifecycleEvent)
添加了四个抽象方法initInternal、startInternal、stopInternal、destroyInternal
LifecycleBase内初始化了LifecycleSupport、LifecycleState
下面来看看LifecycleBase的init方法的逻辑(start/stop/destroy的逻辑与init类似)
注意init方法内部又调用了initInternal方法
LifecycleMBeanBase
LifecycleMBeanBase继承LifecycleBase,LifecycleMBeanBase内又添加了一些新的方法
StandardServer、StandardService等组件继承LifecycleMBeanBase,并重写initInternal、startInternal、stopInternal、destroyInternal方法
下面来看看StandardServer的initInternal方法
当Catalina调用StandardServer的init方法时,由于StandardServer未重写init方法,因此将使用LifecycleBase的init方法,当执行到initInternal()时,由于StandardServer重写了initInternal方法,因此将使用StandardServer的initInternal方法(应用了多态。每个组件的initInternal方法包含其自定义逻辑)
通过Lifecycle,Tomcat启动最顶层组件(Server),即可启动所有组件
- 先码后看 Tomcat是怎么启动容器的——Lifecycle篇 侵立删
- 先码后看 Tomcat是怎么启动容器的——Digester篇 侵立删
- 先码后看 Tomcat是怎么启动容器的——Context篇 侵立删
- 先码后看 Tomcat是怎么启动容器的——web.xml篇 侵立删
- 先码后看 Tomcat是怎么启动容器的——web.xml应用 侵立删
- 先码后看 Tomcat是怎么启动的?——StandardService 侵立删
- 先码后看 Tomcat是怎么启动的?——概论 侵立删
- 先码后看 Tomcat怎么启动容器的——Boostrap篇 侵立删
- 先码后看 Tomcat是怎么启动的?——Bootstrap引导 侵立删
- 先码后看 Tomcat是怎么启动的?——时序分析 侵立删
- tomcat是怎么工作的学习——一个简单的Servlet容器
- tomcat 容器生命周期lifecycle
- tomcat 容器生命周期lifecycle
- tomcat生命周期的管理——生命周期统一接口Lifecycle
- Linux是怎么启动的
- Linux是怎么启动的
- Linux是怎么启动的
- Linux是怎么启动的
- Codeforce 792B Counting-out Rhyme
- Tomcat配置通过域名访问该项目
- 软件测试学习笔记_软件测试的基本概念
- CascadeType级联关系
- java 策略设计模式
- 先码后看 Tomcat是怎么启动容器的——Lifecycle篇 侵立删
- HDFS HA以及Federation,Zookeeper概述
- ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
- ssh免密登录的一个问题解决方法
- Spring Data JPA 配置数据库表根据实体属性自动创建表结构
- 微信开发中三种防注入的查询方法
- Python 3 多线程下载百度图片搜索结果
- Tomcat报java.lang.UnsupportedClassVersionError错误解决方法
- 数据恢复