第一:tomcat定义了一个生命周期的接口 Lifecycle.java接口中定义了几个方法 public void start() throws LifecycleException; public void stop() throws LifecycleException; //以上二个方法主要是在组件启动或者停止的时候被调用, public void addLifecycleListener(LifecycleListener listener); public LifecycleListener[] findLifecycleListeners(); public void removeLifecycleListener(LifecycleListener listener); //以上二个方法主要是观察者的注册、移除、事件变更通知 第二:每个组件都实现了此接口并且实现了这些方法 如:Server组件、Service组件、Connector组件、各个Container容器等 第三:使用LifecycleSupport.java类来进行注册组件变更事件的观察者管理 此类的实例在每一个组件中都保持它的一个实例 private LifecycleSupport lifecycle = new LifecycleSupport(this); 每有注册、移除、事件变更通知时使用此属性调用来管理 在此类中定义了一个private LifecycleListener listeners[] = new LifecycleListener[0];数组在对观察都进行管理的 eg:当某个观察者想注册Server组件的话,调用过程如下: StandardServer.java类中 public void addLifecycleListener(LifecycleListener listener) { lifecycle.addLifecycleListener(listener); } LifecycleSupport.java类中的处理如下: public void addLifecycleListener(LifecycleListener listener) { synchronized (listenersLock) { 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 void start() throws LifecycleException { // Validate and update our current component state if (started) { log.debug(sm.getString("standardServer.start.started")); return; } // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null); [b]lifecycle.fireLifecycleEvent(START_EVENT, null);[/b]//启动事件变更通知 在LifecycleSupport.java中处理变更事件如下: public void fireLifecycleEvent(String type, Object data) { LifecycleEvent event = new LifecycleEvent(lifecycle, type, data); LifecycleListener interested[] = listeners; for (int i = 0; i < interested.length; i++) interested[i].lifecycleEvent(event); } ///还有如stop事件等 public void stop() throws LifecycleException { // Validate and update our current component state if (!started) return; // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(BEFORE_STOP_EVENT, null); lifecycle.fireLifecycleEvent(STOP_EVENT, null); public void fireLifecycleEvent(String type, Object data) { LifecycleEvent event = new LifecycleEvent(lifecycle, type, data); LifecycleListener interested[] = listeners; for (int i = 0; i < interested.length; i++) interested[i].lifecycleEvent(event); } 注意对组件进行了一个封闭成一个事件进行后续的处理, public void fireLifecycleEvent(String type, Object data) { [b]LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);[/b]//这里的继承关系可以查看一下源码 LifecycleListener interested[] = listeners; for (int i = 0; i < interested.length; i++) interested[i].lifecycleEvent(event); } 看看这东东,对开闭原则守的,软件重用非常的好,观察者到此结束……
tomcat各组件生命周期控制
了解tomcat的同学们都知道,apache搞的模块化开发,如tomcat就定义了一大堆的组件, 各个组件负责的责任不同,但是我们的这些组件的生命周期是怎么进行控制的呢,接下来就分析一下如果实现此功能(GOF的观察者模式)的,好了,不费话了,
猜你喜欢
转载自houshangxiao.iteye.com/blog/1599433
今日推荐
周排行