Webx示例-PetStore分析1
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都有moduleType和moduleName這兩個用來表示Module的信息。可以根據這兩個信息,通過ModuleLoaderService提供的查找接口從ModuleLoaderService中查找所需的Module。
ModuleLoaderService有兩個重要組件,ModuleFactory和ModuleAdapterFactory。前者用于根據特定的條件掃描并加載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為該接口提供了兩個實現:ClassModuleFactory和ScriptModuleFactory。前者用于加載Java編寫的module,而后者用于加載用動態語言(如groovy)編寫的module。
ModuleAdapterFactory接口用于將加載到的module轉換成可執行的Module,DataBindingAdapterFactory和ActionEventAdapterFactory是該接口的兩個實現。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
轉載于:https://www.cnblogs.com/lddbupt/p/5578371.html
總結
以上是生活随笔為你收集整理的Webx示例-PetStore分析1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: div根据内容改变大小并且左右居中
- 下一篇: Chapter 4.SQL编程