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的更多相关文章

  1. 使用Lifecycle管理Tomcat中组件的生命周期

    大型软件和汽车制造工厂一样,组件繁多,关系复杂,相互协同完成了汽车的生产过程.软件中的Object就像是工厂中component一样. 下面来看看相关的类和接口: abstract class Lif ...

  2. TOMCAT源码分析——生命周期管理

    前言 从server.xml文件解析出来的各个对象都是容器,比如:Server.Service.Connector等.这些容器都具有新建.初始化完成.启动.停止.失败.销毁等状态.tomcat的实现提 ...

  3. React Native 中组件的生命周期

    概述 就像 Android 开发中的 View 一样,React Native(RN) 中的组件也有生命周期(Lifecycle).所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命 ...

  4. React Native 中组件的生命周期(转)

    概述 就像 Android 开发中的 View 一样,React Native(RN) 中的组件也有生命周期(Lifecycle).所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命 ...

  5. SOUI中对象的生命周期管理

    C++程序员最难的一环就是处理内存泄漏. 很多情况下,一个对象在一个模块里分配了内存,忘记了释放,或者在另一个模块里释放都会导致内存相关的问题. SOUI中大部分暴露在应用层的对象都使用类似COM的引 ...

  6. React 中组件的生命周期

    先上代码, react 用的是 15.0.1 <!DOCTYPE html> <html> <head> <script src="./build/ ...

  7. React Native组件(一)组件的生命周期

    相关文章 React Native探索系列 前言 React Native有很多组件比如Image.ListView等等,想要合理的使用组件,首先要先了解组件的生命周期. 1.概述 无论你是开发And ...

  8. 【RN - 基础】之React Native组件的生命周期

    下图描述了React Native中组件的生命周期: 从上图中可以看到,React Native组件的生命周期可以分为初始化阶段.存在阶段和销毁阶段. 实例化阶段 实例化阶段是React Native ...

  9. ElasticSearch——索引生命周期管理

    从ES6.6开始,Elasticsearch提供索引生命周期管理功能,索引生命周期管理可以通过API或者kibana界面配置,详情参考[index-lifecycle-management] 本文仅通 ...

随机推荐

  1. MFC 的SetWindowPos 用法

    转自于:http://hi.baidu.com/max_new/blog/item/e2bbe607b1f127c57b8947c0.html 许多软件,特别是占桌面面积不是很大的软件,通常都提供了一 ...

  2. hdu1257 最少拦截系统(贪心) 2016-05-19 20:28 90人阅读 评论(0) 收藏

    最少拦截系统 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能 ...

  3. 后台返回的json数据传到前端页面并在页面的表格中填充

    web前端页面: <table id="myTable" cellpadding="1" cellspacing="0" border ...

  4. Spine输出资源一键入Unity3D工具代码

    之前预研过2D骨骼动画编辑工具SPINE,感觉其比cocosStudio及Unity3D自带的骨骼动画编辑器(原生Sprite Tree或Uni2D)要更适合有3DSMax习惯的美术,即Spine更容 ...

  5. Jenkins中执行docker命令报错

    Cannot connect to the Docker daemon. Is the docker daemon running on this host?   在配置Jenkins从Gitlab自 ...

  6. Transaction And Lock--唯一索引下INSERT导致的死锁

    背景: 曾经的一位同事问我:"数据库只有并发INSERT 操作,会造成死锁么?",我没有太多思考地回答"不会",但真的不会吗? 测试: --========== ...

  7. Simple Package Tool 学习

    Simple Package Tool 学习   1.getattr内置函数 getattr(object, name[, default]) python Packages.py install - ...

  8. 安装CentOS桌面环境

    CentOS 作为服务器的操作系统是很常见的,但是因为需要稳定而没有很时髦的更新,所以很少做为桌面环境.在服务器上通常不需要安装桌面环境,最小化地安装 CentOS(也就是 minimal CentO ...

  9. Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad

    Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad 方法一:安装单独组件 ...

  10. 使用vs code开发纸壳CMS并启用Razor智能提示

    关于纸壳CMS 纸壳CMS是一个开源免费的,可视化设计,在线编辑的内容管理系统.基于ASP .Net Core开发,插件式设计: 下载代码 GitHub:https://github.com/Seri ...