还是继续看Tomcat的源码吧,前面分析过了在tomcat中比较重要的一个东西Connector部分。。。
先来看一张图:
可以将tomcat的结构大概这样描述吧:
(1)sever对象是service对象的容器,
(2)service对象是connector对象和container对象的容器,同一个service对象可以包含多个connector对象,但是只能包含一个container对象。。。
(3)container对象是属于自包含的,自己又可以包含多个子container对象,
(4)同时container对象包含一个pipeline对象,pipeline对象可以理解为是valve对象的容器。。。
这里先来贴一下container接口的实现吧:
//主要是定义了父子container的管理以及pipeline的管理
public interface Container extends Lifecycle {
//一些基本的事件的定义
public static final String ADD_CHILD_EVENT = "addChild"; //添加了child的事件
public static final String ADD_VALVE_EVENT = "addValve"; //在pipeline上面添加了valve的事件
public static final String REMOVE_CHILD_EVENT = "removeChild"; //移除child的事件
public static final String REMOVE_VALVE_EVENT = "removeValve"; //移除valve的事件
public Log getLogger();
//用于在jmx上面注册的名字
public ObjectName getObjectName();
public String getDomain();
public String getMBeanKeyProperties();
//pipeline,用于管理关联的values
public Pipeline getPipeline();
//返回关联的cluster
public Cluster getCluster();
public void setCluster(Cluster cluster);
//后台运行的延迟
public int getBackgroundProcessorDelay();
void setBackgroundProcessorDelay(int delay);
//当前container对象的名字
public String getName();
public void setName(String name);
//返回父container
public Container getParent();
//设置父container
public void setParent(Container container);
//获取父classLoader,如果当前没有的话,如果有parent那么返回parent的,否则返回applicationclassloader
public ClassLoader getParentClassLoader();
public void setParentClassLoader(ClassLoader parent);
//返回realm对象,如果当前container对象没有的话,那么返回parent的realm对象
public Realm getRealm();
public void setRealm(Realm realm);
// --------------------------------------------------------- Public Methods
// 在后台执行一些周期性的工作
public void backgroundProcess();
//添加child对象
public void addChild(Container child);
// 添加listener对象,用于响应当前container对象的事件
public void addContainerListener(ContainerListener listener);
//添加属性改变的listener
public void addPropertyChangeListener(PropertyChangeListener listener);
//根据名字返回子child
public Container findChild(String name);
//返回所有的child
public Container[] findChildren();
//返回所有的containerlistener对象
public ContainerListener[] findContainerListeners();
//移除一个child对象
public void removeChild(Container child);
//移除一个containerlistener对象
publ