1. 下载源码

2. 启动容器,加载组件--WebxContextLoaderListener

WebxContextLoaderListener继承自org.springframework.web.context.ContextLoaderListener。它覆盖了一个方法:createContextLoader(),该方法返回一个ContextLoader对象,即上下文加载器。方法的实现采用了匿名内部类方式,返回WebxComponentsLoader的匿名子类,该子类覆盖了一个方法:getDefaultContextClass()。

WebxContextLoaderListener继承了父类ContextLoaderListener中的方法contextInitialized(),该方法内部调用了被覆盖过的方法createContextLoader(),并使用该方法返回的WebxComponentsLoader对象调用org.springframework.web.context.ContextLoader的initWebApplicationContext()方法。

WebxComponentsLoader中的initWebApplicationContext方法除了保存servletContext对象,调用了init()之后,调用父类ContextLoader的同名方法。

默认使用WebxComponentsContext类作为实际启动Spring容器的ApplicationContext。它派生自WebxApplicationContext类。org.springframework.web.context.support.XmlWebApplicationContext的后代。

WebxComponentsLoader.createComponents方法代码很长,但是做的事情只有一件:创建Webx组件

Webx中的组件是一组相关功能的集合,本质上是一个WebApplicationContext。

组件的来源有两个:

•自动扫描WEB-INF目录下的配置文件生成

•webx.xml中指定

将两种方式获取到的组件名集合取并集,就是最终将要处理的组件名集合。注意,在webx.xml中指定的组件名,其配置文件的名字也是webx-*.xml的形式,并不能随意指定。

•自动扫描是可以关掉的,这个时候,只能通过配置的方式来获取组件

•组件的componentPath属性只能通过webx.xml设定

自动扫描是这样工作的:扫描WEB-INF目录下所有匹配webx-*.xml的文件,其中*所代替的字符串为组件名。例如,WEB-INF下有一个名为webx-home.xml的文件,那么它代表一个名为home的组件。

3. 加载其他配置文件

4. 配置服务

RequestContexts服务

详细讲解可参考官方指南第7,8章。http://openwebx.org/docs/requestcontexts.html

upload服务

pull服务

pull service就相当于提供工具类,可以将工具定义成java类,而能够在vm模板中调用

module-loader服务

Module是一段可编程、可执行的逻辑,它由Module接口标识。Module接口只有一个execute方法:

 void execute() throws Exception 

实现自定义的Module只需实现Module接口并在execute()方法中实现自定的执行逻辑。在调用方,通过Module接口调用execute()方法触发Module的执行。

ModuleLoaderService是定义、查找Modules的服务。它通过扫描特定的包或者特定类来加载类,并将加载到的类适配为可执行的Module。ModuleLoaderService中的每个Module都有moduleTypemoduleName这两个用来表示Module的信息。可以根据这两个信息,通过ModuleLoaderService提供的查找接口从ModuleLoaderService中查找所需的Module。

ModuleLoaderService有两个重要组件,ModuleFactoryModuleAdapterFactory。前者用于根据特定的条件扫描并加载module (可以是非Java语言编写);后者则用于将加载到的module转换成可执行的Module(实现Module接口)。因为ModuleFactory加载的module未必都实现了Module接口;即使实现了Module接口,该接口也只有一个无参数的方法,限制了Module的灵活性。所以,!ModuleAdapterFactory通过适配器的机制将未实现Module接口但满足一定条件的module转换为实现了Module接口的Adapter,同时保持原来的处理逻辑不变。

在webx体系中,Module承担了用户提交数据的接收、处理;请求的控制与转发;处理结果的展示等重要功能。Webx缺省定义了三种类型的Module:

  • action:主要用于处理用户提交的数据,以及请求的控制与转发;
  • screen:主要用于处理页面的主体内容;
  • control:主要用于处理页面的部分内容,特别是可重用的内容。

其中,screen和control可以与模板文件配合共同完成页面的展示,也可以脱离模板而独立输出页面。

除了action、screen和control,ModuleLoaderService也支持方便的定义其他类型的Module。

ModuleFactory接口根据特定的条件扫描并加载类,webx为该接口提供了两个实现:ClassModuleFactoryScriptModuleFactory。前者用于加载Java编写的module,而后者用于加载用动态语言(如groovy)编写的module。

ModuleAdapterFactory接口用于将加载到的module转换成可执行的ModuleDataBindingAdapterFactoryActionEventAdapterFactory是该接口的两个实现。DataBindingAdapterFactory对所有具有名为execute的方法的module(可以不实现Module接口,同时execute方法的参数也可以任意定义)进行适配,生成DataBindingAdapter;而ActionEventAdapterFactory则对类型为“action”的module进行适配,生成ActionEventAdapter。DataBindingAdapter和ActionEventAdapter都实现了Module接口。DataBindingAdapter只代理了原有module的名为execute的public方法,执行时候直接调用该方法;而ActionEventAdapter则代理了所有以do开头的public方法(例如doAdd()),执行时根据请求参数的值调用相应的方法。

<services:module-loader>是根据SpringExt机制定义的专门用于定义ModuleLoaderService的元素,其有两个属性:

  • cacheEnabled:是否缓存Module;如果使用缓存,则查找Module时先从缓存中查找,当缓存中不存在时才从ModuleFactory中查找;如果不使用缓存则直接从ModuleFactory中查找。生产中建议开启Module缓存以提高Module查找性能;
  • includeDefaultAdapters:是否使用webx默认实现的ModuleAdapterFactory,包括:DataBindingAdapterFactory、ActionEventAdapterFactory和Webx2ModuleAdapterFactory,如果将这个属性的值设为true,则默认会在moduleLoaderService中加载这几个AdapterFactory而不需要再额外的配置;

<services:module-loader>元素也可以包含子元素,其子元素可以分为两种类型:配置ModuleFactory的子元素和配置ModuleAdapterFactory的子元素。配置ModuleFactory的子元素有:

  • <ml-factories:class-modules>:配置查找classes生成Module的ClassModuleFactory;
  • <ml-factories:script-modules>:配置查找script生成Module的ScriptModuleFactory;
  • <ml-factories:factory >:ClassModuleFactory和ScriptModuleFactory是webx提供的ModuleFactory实现,也可以扩展自定义的ModuleFactory,然后采用<ml-factories:factory >元素配置,其属性与spring提供的<bean>元素相同;

配置ModuleAdapterFactory的子元素也有多个:

  • <ml-adapters:data-binding-adapter/>:配置DataBindingAdapterFactory;
  • <ml-adapters:action-event-adapter/>:配置ActionEventAdapterFactory;
  • <ml-adapters:adapter>:与ModuleFactory类似,也可以对ModuleAdapterFactory进行扩展实现自定义的ModuleAdapterFactory,<ml-adapters:adapter>用于配置自定义的ModuleAdapterFactory。

当设置<services:module-loader>的includeDefaultAdapters=" true"时,会自动为ModuleLoaderService加载DataBindingAdapterFactory、ActionEventAdapterFactory,所以可以不需要再用<ml-adapters:data-binding-adapter/>和<ml-adapters:action-event-adapter/>另外配置。

参考资料

http://code.taobao.org/p/webx/wiki/module_load_service/

http://www.atatech.org/articles/55937

Webx示例-PetStore分析1的更多相关文章

  1. Scala进阶之路-统计商家id的标签数以及TopN示例案例分析

    Scala进阶之路-统计商家id的标签数以及TopN示例案例分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.项目需求 将“temptags.txt”中的数据进行分析,统计出 ...

  2. ZigBee HA示例程序分析

    ZigBee协议栈中自带的HomeAutomation例程,虽然也是操作灯泡,但是,是通过ZCL来统一处理的,符合HA profile规范,互连互操作性较好.下面就简要分析以下ZCL的使用. 在任务数 ...

  3. H5中的web worker示例demo分析

    web worker 是运行在后台的 JavaScript,不会影响页面的性能. 什么是 Web Worker? 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成. web w ...

  4. 使用mybatis实现分页查询示例代码分析

    *******************************************分页查询开始*************************************************** ...

  5. webx roadmap

    SpringExt 自定义Spring Schema的例子 基于Spring可扩展Schema提供自定义配置支持 使用SpringExt扩展Webx的示例 扩展点和捐献 一个namespace下可以声 ...

  6. JS中三目运算符和if else的区别分析与示例

    本文是通过示例详细分析了JS中三目运算符和if else的区别,是篇非常不错的文章,这里推荐给大家.   今天写了一个图片轮播的小demo,用到了判断 先试了一下if else,代码如下: 复制代码代 ...

  7. 精通Web Analytics 2.0 (11) 第九章: 新兴分析—社交,移动和视频

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第九章: 新兴分析-社交,移动和视频 网络在过去几年中发生了不可思议的发展变化:从单向对话到双向对话的转变; 由视频,Ajax和 ...

  8. 【JUC】JDK1.8源码分析之AbstractQueuedSynchronizer(二)

    一.前言 在锁框架中,AbstractQueuedSynchronizer抽象类可以毫不夸张的说,占据着核心地位,它提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.所以很有必 ...

  9. 【JUC】JDK1.8源码分析之Semaphore(六)

    一.前言 分析了CountDownLatch源码后,下面接着分析Semaphore的源码.Semaphore称为计数信号量,它允许n个任务同时访问某个资源,可以将信号量看做是在向外分发使用资源的许可证 ...

随机推荐

  1. nodejs安装及npm模块插件安装路径配置

    在学习完js后,我们就要进入nodejs的学习,因此就必须配置nodejs和npm的属性了. 我相信,个别人在安装时会遇到这样那样的问题,看着同学都已装好,难免会焦虑起来.于是就开始上网查找解决方案, ...

  2. Unity 2D相机公式换算(从其他博客上抄的)

    2d camera, unit坐标,单位换算 2d游戏可以使用平行投影的camera,这种camera需要设置size (orthographicSize),size的含义为屏幕高度的一半,不过单位不 ...

  3. DICOM 协议学习笔记之 How Does DICOM Work ?

    How Does DICOM Work ? DICOM有一套自己自己的模型体系,在进行具体介绍之前,首先讲解下DICOM模型: 在DICOM世界当中,所有的包括患者.检查.医学设备等都可以被视为具有不 ...

  4. 深入浅出Spark的Checkpoint机制

    1 Overview 当第一次碰到 Spark,尤其是 Checkpoint 的时候难免有点一脸懵逼,不禁要问,Checkpoint 到底是什么.所以,当我们在说 Checkpoint 的时候,我们到 ...

  5. Scrum Meeting NO.5

    Scrum Meeting No.5 1.会议内容 暂时料理完了编译,可以写软工了.说多了都是泪T_T 2.任务清单 徐越 序号 近期的任务 进行中 已完成 1 修改url名.参数 √ 2 学习Jso ...

  6. Linux第二周学习总结——操作系统是如何工作的

    第二周学习总结--操作系统是如何工作的 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...

  7. 每日scrum(7)

    今天是小组用来写文稿的日子,包括软件需求分析报告,概要设计报告,详细设计报告,数据库设计报告,软件测试报告,各组员领取自己的任务然后完成~ 任务看板: 燃尽图:

  8. 《实时控制软件设计》之Github提交作业步骤

    在掌握GIT/GITHUB基本操作后,接下来把第一次的编程作业提交到 https://github.com/RTCSD15/HOMEWORK1 ,把第二次的编程作业提交到https://github. ...

  9. NSP4——Network Simulator for P4

    NSP4--Network Simulator for P4 一.前言 NSP4旨在为P4开发者,创建一个可视化的P4流表管理及拓扑建立工具,帮助P4开发者,更好的调试自己的P4程序.此开发工具是基于 ...

  10. 基于 Java Web 的毕业设计选题管理平台--系统设计和任务分配

    一.团队作业:http://www.yzhiliao.com/course/70/task/440/show 二.个人作业: 1.项目的代码托管 (1).GitHub 地址:https://githu ...