tomcat每个组件其实都是继承自一个叫做LifecycleMBeanBase的抽象基类,而这个抽象类继承LifecycleBase的抽象基类,LifecycleBase类实现了Lifecycle接口,关于Lifecycle接口的定义为
public void addLifecycleListener(LifecycleListener listener); public LifecycleListener[] findLifecycleListeners(); public void removeLifecycleListener(LifecycleListener listener); public void init() throws LifecycleException; public void start() throws LifecycleException; public void stop() throws LifecycleException; public void destroy() throws LifecycleException; public LifecycleState getState(); public String getStateName();
而在接口代码的注释中,作者给出了生命周期的运行原则,比如LifecycleBase中实现的Init()方法代码:
@Override public final synchronized void init() throws LifecycleException { if (!state.equals(LifecycleState.NEW)) { invalidTransition(Lifecycle.BEFORE_INIT_EVENT); } setStateInternal(LifecycleState.INITIALIZING, null, false); try { initInternal(); } catch (Throwable t) { ExceptionUtils.handleThrowable(t); setStateInternal(LifecycleState.FAILED, null, false); throw new LifecycleException( sm.getString("lifecycleBase.initFail",toString()), t); } setStateInternal(LifecycleState.INITIALIZED, null, false); }
protected abstract void initInternal() throws LifecycleException;
可以看出生命周期的控制已经在其中显示出来,首先如果不是从NEW状态过来进行初始化的一律为无效状态,一旦进入初始化则进入INITIALIZING状态,其次如果初始化失败进入FAILED的状态,而如果初始化完成,则进入INITIALIZED状态,留出 initInternal()供个性化初始化。
通过addLifecycleListener方法可以添加组件的监听者,当组件进行状态变换时,都会通过事件进行通知
下面为监听者接口的代码
public interface LifecycleListener { /** * Acknowledge the occurrence of the specified event. * * @param event LifecycleEvent that has occurred */ public void lifecycleEvent(LifecycleEvent event); }
只有一个方法,就是当监听者得到事件后该如何处理的方法,而方法的参数则是LifecycleEvent类,一个包含了事件信息的类,实际上就是观察者模式的一个实践,也是接口和需接口的一个对接过程
那么再来说说LifecycleMBeanBase类,实际上他实现了MBeanRegistration接口,实现了这个接口后组件便可以注册在MBeanServer上供远程调用了解tomcat的内部状态等并进行tomcat的控制。