对,我就是那个看完一脸懵,回去啃代码的小渣渣
文章目录
1、Tomcat一键启停
设计就是要找到系统的变化点和不变点。
如果想让一个系统能够对外提供服务,需要创建、组装并启动这些组件;在服务停止的时候,需要释放资源,销毁组件,这是一个动态过程。Tomcat组件之间存在两种关系:
- 组件有大有小,大组建管理小组件。
- 组件有内右外,外层组件控制内层组件。
总结来说,就是请求的处理过程是由外层组件来驱动的。
1.1、LifeCycle接口
系统中的不变点是:组件的创建、初始化、启动、状态及状态的转化。
变化点:每个组件的初始化(启动)方法。
将不变点抽象出来,就是LifeCycle接口。

因为组件的init()和start()调用是由它的父组件的状态变化触发的,可以把组件的生命周期转换成一个个状态,把状态的转变看作一个事件。子组件注册监听父组件的事件,就是观察者模式。
LifeCycle接口里的LifeCycleState定义如下:
public enum LifecycleState {
NEW(false, null),
INITIALIZING(false, Lifecycle.BEFORE_INIT_EVENT),
INITIALIZED(false, Lifecycle.AFTER_INIT_EVENT),
STARTING_PREP(false, Lifecycle.BEFORE_START_EVENT),
STARTING(true, Lifecycle.START_EVENT),
STARTED(true, Lifecycle.AFTER_START_EVENT),
STOPPING_PREP(true, Lifecycle.BEFORE_STOP_EVENT),
STOPPING(false, Lifecycle.STOP_EVENT),
STOPPED(false, Lifecycle.AFTER_STOP_EVENT),
DESTROYING(false, Lifecycle.BEFORE_DESTROY_EVENT),
DESTROYED(false, Lifecycle.AFTER_DESTROY_EVENT),
FAILED(false, null);
private final boolean available;
private final String lifecycleEvent;
private LifecycleState(boolean available, String lifecycleEvent) {
this.available = available;
this.lifecycleEvent = lifecycleEvent;
}
public boolean isAvailable() {
return available;
}
public String getLifecycleEvent() {
return lifecycleEvent;
}
}
看下Event和State之间的对应关系就比较清楚啦~组件到达相应的状态就触发相应的事件。
1.2、抽象基类LifeCycleBase
LifeCycleBase中对组件的公共逻辑进行了实现,如:
- 生命状态的转变与维护
- 生命事件的触发
- 监听器的添加和删除
为了避免混淆(突出是继承自抽象类),子类需要实现的方法在这里都统一改了名字。

LifeCycleBase在接口方法init、start、stop、destory
实现里调用子类要实现的方法initInternal、startInternal、stopInternal、destroyInternal
。以init为例:
@Override
publi