Tomcat中组件的生命周期管理公共接口Lifecycle
Tomcat的组件都会实现一个Lifecycle接口,以方便组件的生命周期的统一管理
interface Lifecycle
组件生命周期中主要的几个方法
增加监听器,事件委托机制
public void addLifecycleListener(LifecycleListener listener); public void removeLifecycleListener(LifecycleListener listener);
组件初始化
public void init() throws LifecycleException; public void start() throws LifecycleException;
组件停止,当stop()方法执行完后会自动调用destroy()方法销毁组件
public void stop() throws LifecycleException; public void destroy() throws LifecycleException; public LifecycleState getState();
事件有:
public static final String BEFORE_INIT_EVENT = "before_init";
public static final String AFTER_INIT_EVENT = "after_init";
public static final String START_EVENT = "start";
public static final String BEFORE_START_EVENT = "before_start";
public static final String AFTER_START_EVENT = "after_start";
public static final String STOP_EVENT = "stop";
public static final String BEFORE_STOP_EVENT = "before_stop";
public static final String AFTER_STOP_EVENT = "after_stop";
public static final String AFTER_DESTROY_EVENT = "after_destroy";
public static final String BEFORE_DESTROY_EVENT = "before_destroy";
public static final String PERIODIC_EVENT = "periodic"; //定期
public static final String CONFIGURE_START_EVENT = "configure_start";
public static final String CONFIGURE_STOP_EVENT = "configure_stop";
在tomcat启动过程中用到的几个组件,如StandardServer,StandardService,StandardEngine,StandardThreadExecutor,Connector等组件都间接实现了Lifecycle接口
如StandardServer
==>public final class StandardServer extends LifecycleMBeanBase implements Server
继承LifecycleMBeanBase
==>实现Server接口----不讨论
===>
public abstract class LifecycleMBeanBase extends LifecycleBase
implements JmxEnabled
===>public abstract class LifecycleBase implements Lifecycle
当调用StandardServer.init()方法时会调用Lifecycle.init()方法,
又因Lifecycle是接口,所以调用LifecycleBase这个接口的实现类LifecycleBase.init()
这个方法内部调用的LifecycleBase.initInternal()
在LifecycleBase中定义如下,就是一个抽象方法。需要继承这个类的所有组件实现这个方法。
protected abstract void initInternal() throws LifecycleException;
==》在LifecycleBase的子类中LifecycleMBeanBase中重写的这个initInternal()
进行组件注册到MBeanServer组件管理服务器中,这里是所有组件进行初始化动作时的操作,最后还是要到StandardServer的initInternal()方法具体实现。
@Override
protected void initInternal() throws LifecycleException { // If oname is not null then registration has already happened via
// preRegister().
if (oname == null) {
mserver = Registry.getRegistry(null, null).getMBeanServer(); oname = register(this, getObjectNameKeyProperties());
}
}
==》最后到StandardServer.initInternal()
上面的流程化简下:
StandardServer.init() =>Lifecycle.init() =>LifecycleBase.init() =>LifecycleBase.initInternal() =>LifecycleMBeanBase.initInternal() =>StandardServer.initInternal()
StandardServer.init()最终调用的是StandardServer.initInternal()
同理,由上面的过程可以知道我们调用组件的start(),stop(),destroy()方法时最后调用的是组件的
startInternal(),stopInternal(),destroyInternal()方法。
也不清楚这是什么设计模式,当感觉这个组件生命周期管理方法值得学习
Tomcat中组件的生命周期管理公共接口Lifecycle的更多相关文章
- 使用Lifecycle管理Tomcat中组件的生命周期
大型软件和汽车制造工厂一样,组件繁多,关系复杂,相互协同完成了汽车的生产过程.软件中的Object就像是工厂中component一样. 下面来看看相关的类和接口: abstract class Lif ...
- TOMCAT源码分析——生命周期管理
前言 从server.xml文件解析出来的各个对象都是容器,比如:Server.Service.Connector等.这些容器都具有新建.初始化完成.启动.停止.失败.销毁等状态.tomcat的实现提 ...
- React Native 中组件的生命周期
概述 就像 Android 开发中的 View 一样,React Native(RN) 中的组件也有生命周期(Lifecycle).所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命 ...
- React Native 中组件的生命周期(转)
概述 就像 Android 开发中的 View 一样,React Native(RN) 中的组件也有生命周期(Lifecycle).所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命 ...
- SOUI中对象的生命周期管理
C++程序员最难的一环就是处理内存泄漏. 很多情况下,一个对象在一个模块里分配了内存,忘记了释放,或者在另一个模块里释放都会导致内存相关的问题. SOUI中大部分暴露在应用层的对象都使用类似COM的引 ...
- React 中组件的生命周期
先上代码, react 用的是 15.0.1 <!DOCTYPE html> <html> <head> <script src="./build/ ...
- React Native组件(一)组件的生命周期
相关文章 React Native探索系列 前言 React Native有很多组件比如Image.ListView等等,想要合理的使用组件,首先要先了解组件的生命周期. 1.概述 无论你是开发And ...
- 【RN - 基础】之React Native组件的生命周期
下图描述了React Native中组件的生命周期: 从上图中可以看到,React Native组件的生命周期可以分为初始化阶段.存在阶段和销毁阶段. 实例化阶段 实例化阶段是React Native ...
- ElasticSearch——索引生命周期管理
从ES6.6开始,Elasticsearch提供索引生命周期管理功能,索引生命周期管理可以通过API或者kibana界面配置,详情参考[index-lifecycle-management] 本文仅通 ...
随机推荐
- MFC 的SetWindowPos 用法
转自于:http://hi.baidu.com/max_new/blog/item/e2bbe607b1f127c57b8947c0.html 许多软件,特别是占桌面面积不是很大的软件,通常都提供了一 ...
- hdu1257 最少拦截系统(贪心) 2016-05-19 20:28 90人阅读 评论(0) 收藏
最少拦截系统 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能 ...
- 后台返回的json数据传到前端页面并在页面的表格中填充
web前端页面: <table id="myTable" cellpadding="1" cellspacing="0" border ...
- Spine输出资源一键入Unity3D工具代码
之前预研过2D骨骼动画编辑工具SPINE,感觉其比cocosStudio及Unity3D自带的骨骼动画编辑器(原生Sprite Tree或Uni2D)要更适合有3DSMax习惯的美术,即Spine更容 ...
- Jenkins中执行docker命令报错
Cannot connect to the Docker daemon. Is the docker daemon running on this host? 在配置Jenkins从Gitlab自 ...
- Transaction And Lock--唯一索引下INSERT导致的死锁
背景: 曾经的一位同事问我:"数据库只有并发INSERT 操作,会造成死锁么?",我没有太多思考地回答"不会",但真的不会吗? 测试: --========== ...
- Simple Package Tool 学习
Simple Package Tool 学习 1.getattr内置函数 getattr(object, name[, default]) python Packages.py install - ...
- 安装CentOS桌面环境
CentOS 作为服务器的操作系统是很常见的,但是因为需要稳定而没有很时髦的更新,所以很少做为桌面环境.在服务器上通常不需要安装桌面环境,最小化地安装 CentOS(也就是 minimal CentO ...
- Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad
Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad 方法一:安装单独组件 ...
- 使用vs code开发纸壳CMS并启用Razor智能提示
关于纸壳CMS 纸壳CMS是一个开源免费的,可视化设计,在线编辑的内容管理系统.基于ASP .Net Core开发,插件式设计: 下载代码 GitHub:https://github.com/Seri ...