Lifecycle
在之前tomcat的分析中,我们通常会提到一个init(),和start(),以及initInternal()和startInternal()。
至于其中的调用过程在前文只是简单提到过,没有详细讲过,通过这一篇,可以详细的了解关于tomcat生命周期的定义,以及其中方法的调用
* start()
* -----------------------------
* | |
* | init() |
* NEW -»-- INITIALIZING |
* | | | | ------------------«-----------------------
* | | |auto | | |
* | | \|/ start() \|/ \|/ auto auto stop() |
* | | INITIALIZED --»-- STARTING_PREP --»- STARTING --»- STARTED --»--- |
* | | | | |
* | |destroy()| | |
* | --»-----«-- ------------------------«-------------------------------- ^
* | | | |
* | | \|/ auto auto start() |
* | | STOPPING_PREP ----»---- STOPPING ------»----- STOPPED -----»-----
* | \|/ ^ | ^
* | | stop() | | |
* | | -------------------------- | |
* | | | | |
* | | | destroy() destroy() | |
* | | FAILED ----»------ DESTROYING ---«----------------- |
* | | ^ | |
* | | destroy() | |auto |
* | --------»----------------- \|/ |
* | DESTROYED |
* | |
* | stop() |
* ----»-----------------------------»------------------------------
以上是来自tomcat中 Lifecycle的一个流程图
这是关于在Lifecycle中的一些方法定义和常量定义
由上就可以了解
-
定义了13个常量,用于LifecycleEvent事件中type属性,
好处:只需要发送一种类型事件LifecycleEvent,就可以判断是什么事件,否则每种事件都得需要定义类
-
定义了4种状态
init(),start(),stop(),destroy()
-
定义了3种监听器相关的方法
addLifecycleListener(),findLifecycleListeners(),removeLifecycleListener()
-
2种获取当前状态
getState(),getStateName()
这些接口方法,以及状态定义构成了tomcat的生命周期,以及一些基本的方法
LifecycleBase
public abstract class LifecycleBase implements Lifecycle
-
实现Lifecycle接口的一个抽象类
-
默认实现了3个监听器方法的实现,添加了一个fireLifecycleEvent()方法
- 利用一个CopyOnWriteArrayList来保存监听器
- 添加了fireLifecycleEvent()方法,处理lifecycleEvent时间的方法。
-
注:tomcat7中由LifecycleSupport来定义关于生命周期的方法
-
注:tomcat7中存在LifecycleSupport,tomcat8.5中不存在LifecycleSupport
-
4个生命周期方法:
-
init(),看一波源码
@Override public final synchronized void init() throws LifecycleException { if (!state.equals(LifecycleState.NEW)) { invalidTransition(Lifecycle.BEFORE_INIT_EVENT); } try { setStateInternal(LifecycleState.INITIALIZING, null, false); initInternal(); setStateInternal(LifecycleState.INITIALIZED, null, false); } catch (Throwable t) { handleSubClassException(t, "lifecycleBase.initFail", toString()); } }
-
将状态设置成了INITIALIZING
-
然后执行具体的initInternal()(这也是为什么之前分析init()方法其实本质就是分析initInternal();)
这里的initInternal都是指子类重写的方法
-
然后再将状态设置成INITIALIZED,初始化结束
-
-
start();看一波源码
@Override public final synchronized void start() throws LifecycleException { if (LifecycleState
-