tomcat-设计模式

166 阅读1分钟

责任链模式

责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将处理后的请求返回,再让下一个处理着继续处理。

在Container中使用责任链模式,通过pipeline-valve处理Request,从Engine -> Host -> Context -> Wrapper;

与过滤器链实现不同:管道/阀门底层是一个单向链表;

门面设计模式

如:Request、RequestFacade。Request中有很多Tomcat内部的方法,不想让开发者直接调用到;

所以在Servlet对象,实现#doGet、#doPost时,参数为 RequestFacade不是Request;

模版设计模式

LifecycleBase中,使用状态机 + 模版设置,完成状态的转换。

如:initInternal、startInternal、stopInternal、destoryInternal 抽象方法

观察者模式

观察者模式: 在对象之间定义一对多的依赖, 当一个对象改变状态, 依赖它的对象都会收到通知, 并自动更新

Server,Service,Engine,Host,Context都实现了Lifecycle接口,通过这个接口管理了这些核心组件的生命周期;

优点
  • 不同的组件 对 同事件有不同的处理逻辑;
  • 不同的组件 关心 不同的事件;
  • 增加、修改处理逻辑不会影响到其它的组件;
事件监听机制
监听事件:LifecycleEvent
1. extend EventObject
​
事件监听器:LifecycleListener
1. #lifecycleEvent,用来接收监听事件
​
事件源:Lifecycle 
1. 实现类LifecycleBase
2. 添加、移除、获取监听器 方法
3. fireLifecycleEvent,调用监听器发送监听事件
事件监听器实现类

EngineConfig#lifecycleEvent

public void lifecycleEvent(LifecycleEvent event) {
    ...
    // 启动、停止 Engine组件
    if (event.getType().equals(Lifecycle.START_EVENT))
        start();
    else if (event.getType().equals(Lifecycle.STOP_EVENT))
        stop();
    ... 
}

HostConfig#lifecycleEvent、ContextConfig#lifecycleEvent(解析web.xml) 等