第六章 生命周期
来源:互联网 发布:淘宝有多少家天猫店 编辑:程序博客网 时间:2024/05/22 03:18
一、概述
catalina包含很多组件。当catalina启动时,这些组件也会一起启动,同样,当catalina关闭时,这些组件也会随之关闭。在这一开一关中就包含这组件的生命周期。一个组件具有生命周期的表现,就是实现了Lifecycle接口。
二、常用类、接口
①Lifecycle接口
package org.apache.catalina; public interface Lifecycle { 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 void addLifecycleListener(LifecycleListener listener); public LifecycleListener[] findLifecycleListeners(); public void removeLifecycleListener(LifecycleListener listener); public void start() throws LifecycleException; public void stop() throws LifecycleException; }
这里的变量或者方法,见名知意。
②LifecycleEvent类
生命周期事件是LifecycleEvent的实例。
package org.apache.catalina; import java.util.EventObject; public final class LifecycleEvent extends EventObject { private Object data = null; private Lifecycle lifecycle = null; private String type = null; public LifecycleEvent(Lifecycle lifecycle, String type) { this(lifecycle, type, null); } public LifecycleEvent(Lifecycle lifecycle, String type, Object data) { super(lifecycle); this.lifecycle = lifecycle; this.type = type; this.data = data; } public Object getData() { return (this.data); } public Lifecycle getLifecycle() { return (this.lifecycle); } public String getType() { return (this.type); }
③LifecycleListener实例
生命周期的事件监听器是LifecycleListener接口的实例。
import java.util.EventObject; public interface LifecycleListener { public void lifecycleEvent(LifecycleEvent event); }
该接口中只有一个方法,即lifecycleEvent()方法。当某个事件监听器听到相关事件发生时,会调用该方法。
④LifecycleSupport类
实现了Lifecycle接口,并且对某个事件注册了监听器的组件必须提供lifecycle接口中3个监听器相关的方法,然后,该组件需要将所有注册的事件监听器存储到一个数组、ArrayList或其他类似的对象中。
package org.apache.catalina.util; import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleEvent; import org.apache.catalina.LifecycleListener; public final class LifecycleSupport { public LifecycleSupport(Lifecycle lifecycle) { super(); this.lifecycle = lifecycle; } private Lifecycle lifecycle = null; private LifecycleListener listeners[] = new LifecycleListener[0]; public void addLifecycleListener(LifecycleListener listener) { synchronized (listeners) { LifecycleListener results[] =new LifecycleListener[listeners.length + 1]; for (int i = 0; i < listeners.length; i++) results[i] = listeners[i]; results[listeners.length] = listener; listeners = results; } } public LifecycleListener[] findLifecycleListeners() { return listeners; } public void fireLifecycleEvent(String type, Object data) { LifecycleEvent event = new LifecycleEvent(lifecycle, type, data); LifecycleListener interested[] = null; synchronized (listeners) { interested = (LifecycleListener[]) listeners.clone(); } for (int i = 0; i < interested.length; i++) interested[i].lifecycleEvent(event); } public void removeLifecycleListener(LifecycleListener listener) { ..省略代码 } }
三、应用程序
UML类图如下:
本章中的SimpleContext类实现了Lifecycle接口,并引用一个LifecycleSupport实例,它还使用一个布尔变量started来指明SimpleContext实例是否已经启动了。启动,start()启动自己及其子组件。stop()与其相反。
public synchronized void start() throws LifecycleException { if (started) throw new LifecycleException("SimpleContext has already started"); // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null); started = true; try { // Start our subordinate components, if any if ((loader != null) && (loader instanceof Lifecycle)) ((Lifecycle) loader).start(); // Start our child containers, if any Container children[] = findChildren(); for (int i = 0; i < children.length; i++) { if (children[i] instanceof Lifecycle) ((Lifecycle) children[i]).start(); } // Start the Valves in our pipeline (including the basic), // if any if (pipeline instanceof Lifecycle) ((Lifecycle) pipeline).start(); // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(START_EVENT, null); } catch (Exception e) { e.printStackTrace(); } // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null); }
这章主要运用的是
观察者模式 http://blog.csdn.net/disiwei1012/article/details/53503247
当然了,责任链模式也有。
0 0
- 第六章 生命周期
- tomcat study 第六章.生命周期
- 《How To Tomcat Works》-第六章 生命周期
- How Tomcat works之第六章:Lifecycle生命周期
- 第六课应用程序的生命周期
- 第六节:Maven生命周期和插件
- 第六章第六题
- 第六章
- 第六章
- 第六章
- 第六章
- 第六章
- 第六章
- 第六章
- 第六章
- 第六章
- 第六章
- 第六章
- [Machine Learning & Algorithm] 随机森林(Random Forest)
- linux-tail命令
- OpenCV 读取、修改、保存图像
- LeetCode 400. Nth Digit
- 欢迎使用CSDN-markdown编辑器
- 第六章 生命周期
- Ember 翻译——教程十:服务和功能
- 修改ubuntu的密码、主机名、用户名
- 时钟
- 正则表达式——“ . ”的用法
- 简易电子钟设计
- cognitive-services系列 -- 使用微软cognitive-services中的人脸识别模块
- Navicat连接Oracle数据库失败,提示“unsupported server charset ZHS16GBK”的解决方法
- Android 代码实现Layout控件编程