之前总结过Tomcat组件结构如图1所示,那Tomcat具体是如何管理繁多组件呢?
Tomcat启动操作:
创建、初始化、启动
Tomcat停止操作:
关闭服务、释放资源、销毁组件
1. 抽象接口
为了统一管理,Tomcat将各组件通用的方法抽象为Lifecycle接口,并以组合方式组装,当调用init()、start()等方法时,父组件只要递归调用子组件中的相关方法即可。
2. 支持扩展
为了扩展对业务逻辑的变动,Tomcat采用观察者模式注册事件监听器,当组件状态改变时,监听该状态的监听器便会触发,依次调用注册到该事件的方法,实现业务逻辑扩展,实现开闭原则。
3. 封装模板
Tomcat通过控制各组件的启停来管理生命周期,各组件的启停逻辑是不变的,比如组件新建后,触发Lifecycle.BEFORE_INIT_ENENT事件,初始化后触发Lifecycle.AFTER_INIT_ENVENT事件等,而具体的执行细节却是不同的,比如对应不同Web App的Context进行初始化时,需要初始化其中不同的Wrapper等。
Tomcat采用模板方法模式,实现了相同逻辑,并将不同的执行细节抽象化:LifecycleBase实现了Lifecycle接口,将Lifecycle中定义的init()、start()、stop()、destroy()方法的抽象成公用的执行模板,并留下一组抽象接口initInternal()、startInternal()、stopInternal()、destroyInternal()供各组件实现各自不同的细节逻辑。
参考资料:
Tomcat如何实现一键式启停