类图
流程
由于web.xml中配置的请求webxCntrollerServlet,因此容器会先创建servlet的实例,servlet在初始化时会调webxControllerServlet的configure创建一个webxController实例并进行初始化,下面是时序图:
流程详解
2.1 取得日志目录
1、ServletContex参数的定义是在整个程序中且独立于各个单独的servlet的,同时也提供给程序中的所有servlet;而ServletConfig中的参数是只提供给定义它的Servlet的,同一程序中的其他servlet是无法使用的;也就是说ServletContext相当于全局变量,ServletConfig相当于局部变量。 2、先取当前servlet的参数,找不到再找全局,还是找不到就用默认参数;最后生成日志目录。2.2 创建引导资源加载器,其实是new一个具体的类来加载资源文件2.3 取得系统的属性配置(由jvm取得),并将loggingRoot、localHost、localAddress参数赋予属性集合中。2.4 配置log4j日志系统:装在log4j的配置文件,根据后缀名解析该配置文件。2.5 取得scheme的实现:搜索schema的实现类,并取得shcema实现类的实例。2.6 取得规格化的servletPaths,啥玩意?2.7 取得webx的配置文件 1、找$applicationRoot/WEB-INF/webx.xml,自然没有 2、取得读取webx配置文件的configuration类 3、读取webx.xml并存储在主configuration中 4、查找并装入所有组件的配置文件 (1)基于web.xml中的init参数查找所有的组件名 (2)为每一个组件生成一个引导资源加载器(其实是原加载器维持了一份map) (3)读取每个组件目录下的webx.xml并合并在主configuration中2.8 设置默认的services和配置项(经典的webx方案) 1、先试图查找WEB-INF/webx-default.xml,如果找到,则装载并作为默认配置文件,合并到configuration中 2、装在TURBIE的配置文件,合并到configuration中2.9 初始化serviceManager 1、取得DefaultWebxServiceManager并实例化 2、将configuration和引导资源加载器传给该manager 3、初始化 (1)创建service名称和service配置的映射,这个映射是根据配置文件中的设置产生的 ①根据configuration中的key取得所有instanses的名称 ②取得所有instances的instanceConfiguration保存在map中 ③遍历configuration中的class,实例化service instance,保存在map中:services.put(instanceKey, instance) ④采用set来取得service names,再加上Resourceloaderservice ⑤将未声明的service补全,包括main和instance的? (2)初始化ResourceLoaderService (3)初始化那些earlyInit=true的service instances2.10 将webx controller实例设置到servlet context中,以便外部系统可以使用2.11 如果指定了initAllServices,则强制初始化所有services。这里调用各个Service的默认实现的init方法四、一些感悟1、首先,容器启动时,将初始化 WebxControllerServlet; WebxControllerServlet 将判断当前的 ServlerContext中有没有名为webx.context的属性 (该属性保存的是WebxController,是webx M-V-C框架 的入口);如果是初次启动,WebxController是不存在的。 因此WebxControllerServlet将通过 WebxLoader装载和初始化webx中的 services,它负责完成主要的初始化操作, 然后将框架的配置保存在 WebxController中,以后处理请求的时候就可以直接通过该对象完成 。 WebxLoader用来加载并完成框架的初始化; WebxController则是用来保存框架初始化好之后的信息。
2、WebxLoader初始化时将创建一个WebappStarpResourceLoaderService负责读取webx 的配置文件. 对于多 car结构的应用将从根WebappBootStartpResourceLoaderService(InstanceName为null) 中再为每个 car分别实例化一个WebappBootStartpResourceLoaderService对象( 在初始化每个car的DefaultResourceLoaderService 时完成)。 该对象中保存 car实例的名称(WebappBootStartpResourceLoaderService.instanceName) ,取资源时将把该名称加入到资源路径,例如 WEB-INF/webx.xml将会变为WEB-INF/ instanceName/webx.xml. 在webx初始化的时候,将两次为每个 car生成WebappResourceLoaderService ,一次是在读取每个car的webx.xml 文件的时候;一次是初始化每个car对应的DefaultResourceLoaderService 的时候,两次都是通过 BootstarpResourceLoaderService.getInstance())。3、initMapping()完成的主要工作是:
分析应用包含的 car的数量(Instance) 和Service的数量. 解析属于每个 Instance的配置信息和InstanceContext信息,并为每个 Service分别创建一个ServiceInstance(这个对象中包含 Service的类名以及配置信息等,将用于创建 Service对象,每个 Service只会被初始化一次,初始化的次数通过 ServiceInsatnce的控制,注意的是一个Service不管是上文提及 4种类型中的哪一种,都将为每个 Component和main-instance 创建一个 ServiceInstacne,有些ServiceInstacne并不会被真正使用到 )