当前对象为StandardEngine[Catalina]。
1、将HashMap<String,Container> children =new HashMap<String,Container>(),转换为数组。复制给children[]。其中children是通过第六节注入进去,也就是server.xml中的<host>。
2、进行[StandardEngine[Catalina].StandardHost[localhost]]的start()方法进行启动。类继承关系是class StandardHostextends ContainerBase implements Host,abstract classContainerBase extends LifecycleMBeanBase implements Container。
3、调用LifecycleBase的start()方法。
(1)、init()方法,当前对象StandardEngine[Catalina].StandardHost[localhost]
1)、setStateInternal(LifecycleState.INITIALIZING, null, false);因为standardHost的listeners的数量为1,所以去执行里面的listeners方法。
1))、HostConfig在before_init的事件中,主要是设置一些属,setCopyXML(false);
setDeployXML(true);setUnpackWARs(true);
2)、initInternal();主要是注册mbean。
3)、setStateInternal(LifecycleState.INITIALIZED, null, false);步骤跟1)类似。
(2)、setStateInternal(LifecycleState.STARTING_PREP, null, false);步骤跟(1)中的1)类似。
(3)startInternal(),当前对象为StandardEngine[Catalina].StandardHost[localhost],调用StandardHost的startInternal()方法。
1)、得到字符串errorValve=“org.apache.catalina.valves.ErrorReportValve”。
2)、获取pipeline的valves。
1))、pipeline是在继承ContainerBase的类,构建对象的时候创建。
2))、创建的时候传入当前的container也是就this.也就是设置container,CatalinaFactory的类中。
3))、创建当前对象的时候设置Basic,StandardHost的类中。
4))、追加basic到Value。StandardPipeline的类中。
3)、让pipeline(StandardPipeline)增加一个org.apache.catalina.valves.ErrorReportValve。
1))、设置valve的container为StandardHost
2))、进行重新设置valve的顺序,AccessLogValve,ErrorReportValve,StandardHostValve
3))、container.fireContainerEvent(Container.ADD_VALVE_EVENT, valve);如下图,StandardHost的cb(ContainerBase)的listeners为0,return返回,图中的代码为ContainerBase的类中,其中listeners为ContainerBase的protectedArrayList<ContainerListener> listeners = new ArrayList<ContainerListener>();与之前提到的listeners不同的之处是,前面的为LifecycleSupport的在LifecycleBase的属性中,现在提到的是ContainerBase的属性。
4)、调用父类ContainerBase的startInternal(),进行Pipeline[StandardEngine[Catalina].StandardHost[localhost]]的启动。
1))、进行Pipeline[StandardEngine[Catalina].StandardHost[localhost]]的启动,后续介绍。
2))、setState(LifecycleState.STARTING),后续介绍。
3))、threadStart(),后续介绍。
(4)、setStateInternal(LifecycleState.STARTED,null, false),当前对象为StandardEngine[Catalina].StandardHost[localhost]。步骤跟(1)中的1)类似。