您的位置:首页 > 其它

漫步webx3--webx3学习记录之框架初始化

2011-12-25 22:49 246 查看

写在前面的话

本文是针对webx框架系列总结文章中的其中一篇《框架启动的学习总结》,适合以下两类读者,阅读者可以带着不同的心态去阅读:

1. 如果你觉得你已经对webx3的框架(或者webx的历史版本)有了一定程度的了解,可以将此文当作是对webx框架结构的回顾,并对其中的错误或者不足的内容进行指正。

2. 如果正在webx3框架的学习起步或者学习中的阶段,可以在阅读此文时带着共同探讨的心情,看看是否你我会在某些问题和看法上有否共鸣,并希望能够有一定的指导作用。

对于webx3框架的起步学习阶段,还是遇到了不小的挫折。一来不知道自己该从何开始看起,二来自己的web基础知识不够扎实,看代码和文档的过程中,很多前置概念无法正确理解,因此遇到了不少的阻碍。

该如何正确的认识webx框架,又该如何领悟框架各部分的作用。在学习之前中,我首先问自己:

webx框架到底做了什么,为什么我们要使用它?

(以下是作者的原话)

1. webx是一套基于Java Servlet API的通用Web框架,提供了创建一个web应用程序所需要的所有必要功能 [1]。

2. webx的特点:

1)经过历史检验的“成熟”性。

2)具有良好的“扩展”机制,支持开发者在框架之上添加新的功能。

3)层次化的设计,可以对框架进行裁剪和定制。

这些webx的特性是怎么做到的,为什么webx的框架可以拥有这些特性?

本文不能将webx3的特性完整的描述清楚,有关内容会分几次一一讲述完成。但这些问题仍然是学习过程中必须要牢记的问题,当能够完整回答的时候,也就意味着真正掌握了webx3框架。

Webx3的总体结构

webx3的总体框架如图1所示:



图1. webx3的总体框架
webx3将web框架分为了三层:spring-ext、webx framework及webx turbine。其中,spring-ext构成了webx3的基础核心。在webx3中,spring-ext提供了组建扩展的能力,使得所有的webx功能都依附于spring-ext存在构成webx3的基础框架。webx framework基于servlet API,提供初始化webx框架,错误处理,初始化日志系统等非具体网页功能外的web基础服务。webx turbine在webx framework之上,基于webx
framework,实现网页的具体功能,例如:action处理、表单处理、模板渲染等。

三层结构,外层结构依赖内层结构存在,越外层越细节,越内层越抽象;越外层越易改变,越内层越稳定。内层仅对外层提供接口开放,外层扩展时不修改内层代码。内层对外层情况未知,永不依赖外层。

webx3的启动

讲到webx3的启动,先简单的说一点web容器启动加载web应用的过程。



图 2. 容器的启动过程
以jetty为例,使用eclipse跟踪程序流向,将容器启动加载web应用的过程以图2的形式进行展现:main函数启动->代理器启动->配置文件读取器启动->容器启动->部署管理器启动->web应用扫描器启动->扫描部署的web应用->应用生命周期绑定->web应用配置读取。

因为没有涉及具体的源码,所以这个过程可能与实际的jetty容器启动会有所出入,而且也无法描述方法间的调用关系及层次关系。但可以看到从web应用配置读取开始,容器便交给具体的web应用,由其开始应用初始化过程。这便是我们接下来所会涉及的学习内容,webx3框架的初始化流程,如何在容器中创建基于webx框架的应用程序。

Webx3的初始化流程

web应用配置由web.xml完成,来看下基于webx框架的web.xml做了些什么:
<!-- 初始化日志系统 -->
<listener>
<listener-class>com.alibaba.citrus.logconfig.LogConfiguratorListener</listener-class>
</listener>

<!-- 装载/WEB-INF/webx.xml, /WEB-INF/webx-*.xml -->
<listener>
<listener-class>com.alibaba.citrus.webx.context.WebxContextLoaderListener</listener-class>
</listener>
首先是初始化日志系统,由LogConfiguratorListener完成。然后是WebxContextLoaderListener,装载webx的components的配置文件并实例化。在具体介绍这个读取配置文件及实例化的流程前,我们先做下扩展阅读,了解webx框架中的一些设计理念。

扩展阅读:

webx中的component概念:
webx framework将web应用分解为多个小应用模块,并将每个小应用模块独立,形成级联的组建化模式,也就是component概念(如图3、4所示)



图 3. webx的component概念图



图 4. webx component级联的具体实现关系

webx定义component的规则:
1)每个小应用模块独享一个Spring Sub Context子容器。两个子容器之间的beans无法互相注入。

2)所有小应用模块共享一个Spring Root Context根容器。根容器中的bean可被注入到子容器的bean中;反之不可以。

(关于bean涉及spring-ext中的内容,暂不做介绍,详细可参看webx关于spring-ext的文档说明及源码spring-ext模块)
在component之中,会拥有一个root component,在其内所创建的bean可被所有component“共享”。
这种级联模式,可以独立应用中子模块的开发,并解决公共部分的共享问题。

WebApplicationContext概念:



图 5. webx中的WebApplicationContext继承关系

我们将webx中的WebApplicationContext的继承关系打印出来,并将webx框架中对其所做的工作做了用红色的下划线框线进行了标注。可以看到,WebApplicationContext其目的是读取每个component的配置信息,用于实例化。在webx中,对这种“读取”操作进行了增强,在这里我们用红色的框线表明。这一部分的内容,在spring-ext与resourceloading中会进行介绍。

WebxController与WebxRootController概念:
个人理解,在webx中作为controller(控制器)的目的是限制请求对component的访问,做到component访问门户的作用,这一部分的实现及启动原理在webx framework的请求响应中会作出相关的解释。

在了解了webx的设计理念之后,webx启动的整体流程也就可以进行大致的想象了:读取各个component的配置文件->实例化生成component,构建components的级联关系。



图 6. webx框架启动时序图

具体流程为:
1. 容器发现WebxContextLoaderListener,调用contextInitialized方法。
2. 创建WebxComponentsLoader对象。
3. 调用initWebApplicationContext方法读取WebApplicationContext(由WebxComponentsContext实现)。
4. 利用spring-ext核心框架的内容,读取component配置信息,并实例化component。
5. 将components加入运行线程。

参考文献

[1] webx3的开源项目及其详细文档说明 http://openwebx.org/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息