漫步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/相关文章推荐
- java并发集合框架学习记录
- spring4学习记录03-spring mvc实战之框架构建
- 学习开源框架WebX的总结
- CodeIgniter框架源码学习之框架初始化文件--CodeIgniter.php
- TP框架代码学习 学习记录 3.2.3
- Yaws(erlang web服务器框架) 学习记录之使用自定义函数输出WEB页内容
- 3D图形学编程基础-基于Direct3D11-学习记录(一)初始化DX设备,实现立方体绘制
- Laravel框架学习记录一 框架基础
- Java集合框架学习记录
- Activiti框架学习记录-03
- Yaws(erlang web服务器框架) 学习记录之文件上传
- Cesium 学习记录(2) 初始化Viewer
- Yaws(erlang web服务器框架) 学习记录之Cookie使用
- C++学习记录14--C++成员初始化列表
- webx2.0-框架初始化
- webx框架和SeaJS学习
- android学习记录(三)百度地图错误---手机显示只有一个框架,没有地图内容。
- java框架学习,记录一下,给自己一个动力
- Spring 4 官方文档学习(②)Web MVC 框架之编码式Servlet容器初始化
- 17年2月24日Java后台学习记录,Spring Maven更换版本报错,SSM框架整合,Mysql语句整理。