一,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调用了抽象方法来实现骨架逻辑。