第六章 生命周期

来源:互联网 发布:淘宝有多少家天猫店 编辑:程序博客网 时间: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
原创粉丝点击