tomcat系列之五:Tomcat各个组件生命周期

Easter79
• 阅读 151

一,Tomcat中各个组件的关系

1,组件有大有小,大组件管理小组件。比如Server管理Service,Service管理连接器和容器

2,组件有内有外,外层组件控制内层组件。比如外层组件连接器负责对外交流,外层组件调用内层组件完成业务功能

二,创建组件的顺序

先创建子组件,再创建父组件,然后把子组件 注入 到父组件中

先创建内层组件,再创建外层组件,然后把内层组件 注入 到外层组件中

三,如何实现统一管理组件的生命周期

1,LifeCycle接口

  每个组件都要经历创建,初始化,启动这几个过程(系统的不变点)。每个具体组件的初始化方法是不一样的(系统的变化点)。

所以,可以把不变点抽象出来成为一个接口,这个接口和生命周期有关,叫LifeCycle。接口中只定义方法:init(),start(),stop(),destory()。然后每个具体的组件去实现这个方法。

在父组件的init()方法中需要创建子组件并调用子组件的init()方法。在父组件的start()方法里调用子组件的start()方法。这样只需要调用最顶层组件,调用Server组件的init()和start()方法。这样整个Tomcat就被启动起来了。

2,LifeCycle 事件

  组件的init(),start()调用是由它的父组件的状态变化触发的,上层组件的初始化会触发子组件的初始化,上层组件的启动会触发子组件的启动。可以把组件的生命周期定义成一个个状态,把状态的转变看做是一个事件。事件里有监听器,在监听器中实现一些逻辑,并且监听器也可以添加和删除。

  组件的生命周期:

NEW,INITIALIZING,INITIALIZED,STARTING_PERP,STARTING,STARTED。  

  LifeCycle接口

void init()
void start()
void stop()
void destory()
void addLifecycleListener(LifecycleListener)  添加监听器
void removeLifecycleListener(LifecycleListener)  移除监听器

当组件达到响应的状态,就触发响应的事件。比如NEW状态表示组件刚被实例化。当init()方法被调用时,状态就变成INITIALIZING状态,这时,会触发BEFOREinit_event事件,如果有监听器在监听这个事件,它的方法会被调用。

3,LifeCycleBase 抽象基类

定义一些抽象方法,基类不去实现这些方法。子类去实现这些方法。

LifeCycleBase:

abstract void initInternal()
abstract void startInternal()
abstract void stopInternal()
abstract void destoryInternal()

LifeCycleBase抽象类实现了LifeCycle接口中的所有方法,还定义了抽象方法交给子类去实现,这就是模板设计模式。LifeCycle调用了抽象方法来实现骨架逻辑。

点赞
收藏
评论区
推荐文章
Souleigh ✨ Souleigh ✨
2年前
React 组件间通信的10种方法
组件间通信方式总结父组件子组件:1.Props2.InstanceMethods子组件父组件:1.CallbackFunctions2.EventBubbling兄弟组件之间:1.ParentComponent不太相关的组件之间:1.Context2.Portals3.Global
浩浩 浩浩
1年前
【Flutter实战】层叠布局(Stack、Positioned)
4.5层叠布局Stack、Positioned层叠布局和Web中的绝对定位、Android中的Frame布局是相似的,子组件可以根据距父容器四个角的位置来确定自身的位置。绝对定位允许子组件堆叠起来(按照代码中声明的顺序)。Flutter中使用Stack和Positioned这两个组件来配合实现绝对定位。Stack允许子组件堆叠,而Pos
Alex799 Alex799
1年前
vue最新面试题
最近在面试,总结几个重点的面试题:一、vue父子组件之间的传值:简单来说,子组件通过props方法接受父组件传来的值,子组件通过$emit方法来向父组件发送数据。(具体案例可以看我之前写的博客)。二、vue生命周期函数:beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestr
徐小夕 徐小夕
1年前
《精通react/vue组件设计》之5分钟教你实现一个极具创意的加载(Loading)组件
前言本文是笔者写组件设计的第八篇文章,今天带大家用5分钟实现一个极具创意的加载(loading)组件.涉及的核心知识点主要是css3相关特性,如果大家非常熟悉,可直接跳过介绍直接看正文.时刻问自己:是否具备创造力?笔记前端组件的一般分类:通用型组件:比如Button,Icon等.布局型组件:比如Grid,Layout布
Stella981 Stella981
1年前
Flutter子组件调用父组件方法修改父组件参数
子组件调用父级组件方法的主要实现是父组件给子组件传入一个方法,然后在子组件中调用父级方法来修改父级的参数。看一下效果图!(https://img2018.cnblogs.com/blog/1038765/201907/103876520190702152130487420290106.gif)父级组件实现在父级组件中写一个
Stella981 Stella981
1年前
Spring Boot快速入门(三):依赖注入
springboot使用依赖注入的方式很简单,只需要给添加相应的注解即可@Service用于标注业务层组件 @Controller用于标注控制层组件@Repository用于标注数据访问组件,即DAO组件 @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。然后在使用的地方使用@A
Easter79 Easter79
1年前
Swing自定义事件
1.Swing自定义事件将一个组件的事件传递给另一个组件.使用EventListenerList来管理事件,当A组件触发事件的时候,调用方法fireActionPerformed()来触发事件,然后再B组件中actionPerformed()方法来接收事件.当在容器KeyTextComponent中按下鼠标,我们就可以在Jframe中捕获触发的事
Stella981 Stella981
1年前
ElasticSearch学习日志(一)
        搜索程序一般由索引链和搜索组件组成。     索引链主要是先检索原始内容,再根据原始内容来创建对应的文档,并对创建的文档进行索引;     搜索组件用于接收用户的查询请求并响应结果,一般由用户接口、构建可编程查询语句的方法、查询语句执行引擎及结果展示组件组成。 一、ES的基本概念      索引(I
Easter79 Easter79
1年前
taro 组件的外部样式和全局样式
自定义组件对应的样式文件,只对该组件内的节点生效。编写组件样式时,需要注意以下几点:1.组件和引用组件的页面不能使用id选择器(a)、属性选择器(\a\)和标签名选择器,请改用class选择器。2.组件和引用组件的页面中使用后代选择器(.a.b)在一些极端情况下会有非预期的表现,如遇,请避免使用。3.子
Stella981 Stella981
1年前
Angular使用总结
  之前自己写的公共组件,都是会先引入,需要调起的时候再通过service控制公共组件状态、值、回调函数什么的。但是有一些场景不适合这种方式,还是动态添加组件更加好。通过写过的一个小组件来总结下。创建组件  场景:鼠标移动到图标上时,展示解释性的说明文字。那就需要创建一个普通的tooltip组件。如下:!(https://oscim