国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

設(shè)計心得——用 XDoclet 減少代碼膨脹

2019-11-18 13:05:47
字體:
供稿:網(wǎng)友

  開放源代碼的 XDoclet 代碼生成引擎,是許多領(lǐng)先的 java 框架不可缺少的組成部分,經(jīng)常被用作面向?qū)傩缘木幊毯统掷m(xù)集成的引擎。但是 XDoclet 還有一些不太惹人注目的地方:對初級開發(fā)人員來說,它太難把握、太難精通。在這篇文章中,流行作者 Sing Li 以 XDoclet 為對象,揭示了其內(nèi)部簡單卻優(yōu)雅的設(shè)計,使您能夠理解這項技術(shù),并將它應(yīng)用在實踐當中。
  
  XDoclet 能夠很輕易成為您的 Java 編程工具箱中的一個更加通用的跨技術(shù)代碼生成工具。不幸的是,開發(fā)人員經(jīng)常忽視 XDoclet 的一般用途,只有將它捆綁在大型開發(fā)框架或者 IDE 中,作為其中的一個隱藏元素時,才會用到它。人們經(jīng)常認為很難將 XDoclet 應(yīng)用在定制解決方案上。這篇文章的目的就是要消除這個迷惑,把 XDoclet 從常見的復(fù)雜陷阱中解脫出來,并向您展示了如何能夠利用這個代碼生成引擎。
  
  我會用一個實際的例子演示 XDoclet 的用途,該例子將接收一個 POJO(plain old Java object),并用 XDoclet 生成完整 Web 應(yīng)用程序的全部文件,這些文件是把數(shù)據(jù)輸入關(guān)系數(shù)據(jù)庫所必需的。該示例使用了 XDoclet 的 自定義模板代碼生成功能,以及它對 Hibernate 對象關(guān)系映射工具、StrUCt Web 應(yīng)用程序框架和應(yīng)用程序服務(wù)器的內(nèi)部支持。(請參閱 參考資料)。
  
  智能代碼生成器
  
  XDoclet 的核心功能是根據(jù)以下組合來生成代碼的(或者生成其他配置/數(shù)據(jù)文件):
  
  進行非凡標記的 Java 源文件。
  
  預(yù)先定義的模板。
  
  與其他基于模板的代碼生成技術(shù)(例如 Velocity;請參閱 參考資料)相比,XDoclet 具有以下獨特優(yōu)勢:
  
  XDoclet 與 Apache Ant(請參閱 參考資料)緊密集成,從而提供了高度自動化的操作。
  
  把控制代碼生成和模板處理的 XDoclet 標簽作為內(nèi)聯(lián)注釋嵌入到 Java 源代碼文件中。這消除了同步多個相關(guān)文件和控制文件的需要。
  
  XDoclet 的內(nèi)置 Java 解析器使用它對 Java 代碼結(jié)構(gòu)的深入理解,為輸入的 Java 代碼建立內(nèi)部 結(jié)構(gòu)模型。該結(jié)構(gòu)模型又經(jīng)常被叫作 元數(shù)據(jù)(metadata),因為它包含與關(guān)聯(lián)代碼有關(guān)的數(shù)據(jù)。
  
  XDoclet 的模板生成邏輯擁有對輸入 Java 代碼的內(nèi)部結(jié)構(gòu)模型的完全訪問權(quán)。
  
  接下來,我將進一步研究 XDoclet 是如何工作的,以幫助您理解這些特性。
  
  XDoclet 操作
  
  圖 1 顯示了 XDoclet 要求的輸入和生成的輸出。
  
  
圖 1. XDoclet 黑盒子

  
 設(shè)計心得——用 XDoclet 減少代碼膨脹(圖一)

  您可以看到,包含嵌入式 XDoclet 標簽的 Java 源代碼是系統(tǒng)的輸入。在 Apache Ant 的驅(qū)動下,XDoclet 處理輸入的代碼,生成的輸出文本文件可以是 Java 源代碼、Html 頁面、xml 文件等。為了處理輸入,XDoclet 需要使用模板(保存在 .xdt 文件中)和標簽處理器(用 Java 編碼)。XDoclet 把模板和標簽處理器打包成“模塊”,不同的“模塊”處理不同的問題域。
  
  XDoclet 生成的結(jié)構(gòu)模型
  
  XDoclet 對包含嵌入式 XDoclet 標簽的輸入 Java 源代碼進行解析,并為代碼建立非常具體的結(jié)構(gòu)模型。結(jié)構(gòu)模型中的每個元素都代表源代碼中的一個 Java 結(jié)構(gòu)。圖 2 顯示的結(jié)構(gòu)模型,揭示了 XDoclet 跟蹤的代碼構(gòu)造和關(guān)系。
  
  
圖 2. XDoclet 的解析的 Java 源代碼的內(nèi)部結(jié)構(gòu)模型

  
 設(shè)計心得——用 XDoclet 減少代碼膨脹(圖二)

  圖 2 中的結(jié)構(gòu)模型跟蹤類、接口、方法之類的代碼構(gòu)造(模型元素)。該模型還跟蹤元素之間的關(guān)系,例如繼續(xù)和接口實現(xiàn)。以內(nèi)聯(lián)注釋的形式嵌入在源代碼中的 XDoclet 標簽被解析為模型元素的屬性,并被跟蹤。
  
  通用的 Javadoc 引擎
  
  能夠理解 Java 代碼結(jié)構(gòu)模型的智能代碼生成引擎不是什么新概念。實際上,它是 JDK 自帶的 Javadoc 工具的運作方式。通過解析帶有非凡 Javadoc 標簽的 Java 源文件,Javadoc 工具可以為所有 Java 程序的內(nèi)置結(jié)構(gòu)元素(包括類、接口、字段和方法)生成 HTML 文檔。Javadoc 還具有非凡 Java 語言概念方面的知識,例如繼續(xù)、抽象類、存儲類和修飾符。
  
  XDoclet 的誕生,來自這樣一個觀察:適用于任意代碼生成的 Javadoc 的通用版本,在許多編程場合下會極為有用。但是,實際的 Javadoc 源代碼不是為通用的代碼生成設(shè)計的,而只是為了生成 HTML 文檔。由于無法重用現(xiàn)有代碼,XDoclet 開發(fā)小組從頭開始重寫了引擎,并顯著優(yōu)化了它的性能。
  
  深入 XDoclet
  
  圖 3 顯示了 XDoclet 的內(nèi)部結(jié)構(gòu),揭示了使其運行的功能塊。
  
  
圖 3. XDoclet 內(nèi)部的功能塊

  
 設(shè)計心得——用 XDoclet 減少代碼膨脹(圖三)

  如圖 3 所示,Apache Ant 在運行的時候控制著 XDoclet 的配置和操作。XDoclet 解析輸入的 Java 源代碼,并在內(nèi)存中生成結(jié)構(gòu)模型。模板引擎通過處理一組模板和標簽處理器,生成輸出文件。模板和標簽處理器可以是內(nèi)置的,也可以是定制的。在代碼生成期間,模板和標簽處理器擁有對結(jié)構(gòu)模型的完全訪問。
  
  XDoclet 虛假的復(fù)雜性
  
  XDoclet 實質(zhì)上就是一個通用的 Javadoc 引擎(請參閱側(cè)欄, 通用的 Javadoc 引擎)。那么,是什么讓它看起來這么復(fù)雜呢?答案在于:XDoclet 幾乎從未被單獨討論過,而總是藏在其他許多復(fù)雜的技術(shù)中。圖 4 顯示了了圍繞在 XDoclet 四周的復(fù)雜性迷霧(請參閱側(cè)欄 為什么 XDoclet 看起來比實際的要復(fù)雜得多)。
  
  為什么 XDoclet 看起來比實際的要復(fù)雜得多
  
  Apache Ant 自動進行 Java 軟件的生成過程。構(gòu)建治理過程通常是生產(chǎn)項目中更復(fù)雜過程中的一部分。構(gòu)建治理的術(shù)語和概念被集成到 Apache Ant 中,而且是理解其操作的先決條件。成熟的 Ant 腳本可能會非常復(fù)雜。Ant 的每個新版本,都會引入一些新的特性集,從而進一步增加了復(fù)雜性。這形成了 XDoclet 表面的復(fù)雜性,因為 XDoclet 需要 Ant 才能執(zhí)行。
  
  XDoclet 處理的問題領(lǐng)域是復(fù)雜性的另一個來源。在發(fā)布 XDoclet 的時候,XDoclet 已經(jīng)可以為 EJB 組件集成、J2EE Web 容器集成、Hibernate 持久性層、Struts 框架、Java 治理擴展(JMX)等生成代碼。這些問題領(lǐng)域中的每一個領(lǐng)域都有一大套該領(lǐng)域?qū)S玫男性捄透拍?。從這些復(fù)雜的問題領(lǐng)域出來的問題,經(jīng)常主導(dǎo)著 XDoclet 的討論,這也提高了 XDoclet 表面的復(fù)雜性。可能是“只見森林,不見樹木”。
  
  
圖 4. XDoclet 的復(fù)雜耦合

  
設(shè)計心得——用 XDoclet 減少代碼膨脹(圖四)

  在圖 4 中,您可以看到 XDoclet 與以下內(nèi)容是緊密相關(guān)的:
  
  Apache Ant,它控制著 XDoclet 的操作。XDoclet 是作為一組 Ant 任務(wù)存在的,沒有 Ant 則不能執(zhí)行。
  
  與生成文件關(guān)聯(lián)的具體問題領(lǐng)域的一些細節(jié)。
  
  XDoclet 本身卻是驚人地簡單,正如下面示例中的工作代碼所示的那樣。
  
  使用 XDoclet
  
  現(xiàn)在,您可以通過研究我向您提供的數(shù)據(jù)入口應(yīng)用程序示例,來觀察 XDoclet 的實際工作。(要下載這個示例中使用的 Java 代碼、XDoclet 模板和 Ant 腳本,請單擊本文頂部或底部的 Code圖標,或者請參閱 下載部分。)我們將從檢查清單 1 所示的 Java 代碼開始,這部分代碼表示了一個客戶的地址。該地址被編碼成 JavaBean 組件,其中的 XDoclet 標簽是以黑體字形式顯示的:
  
  清單 1. 用 XDoclet 標簽標記的 AddressBean.java 源文件
  
  package com.ibm.dw.beans; import java.io.Serializable; /**     * @dw.genStrutsAction action="/addAddress.do" * @hibernate.class table="ADDRESS"*/ public class AddressBean implements Serializable { PRivate String streetNumber = ""; private String street = ""; private String city = ""; private String country = ""; private String postalCode = ""; private long id = 0;  public AddressBean() { } /**     * @dw.genStruts formlabel="Street Number" * @hibernate.property length="10"*/ public String getStreetNumber() {  return streetNumber; } public void setStreetNumber(String inpStreetNumber) {  streetNumber = inpStreetNumber; } /**     * @dw.genStruts formlabel="Street" * @hibernate.property length="40"*/ public String getStreet() {   return street; } public void setStreet(String inpStreet) {  street = inpStreet; }      ...... more Address bean properties ...... /**     * @hibernate.id generator-class="native"*/ public long getId( ) {     return id; } public void setId(long inId) {  id = inId; } }
  
  在清單 1 中,需要注重的是,要把 XDoclet 標簽嵌入到注釋中,緊放在相關(guān)代碼元素(例如字段、方法、接口或類)的前面。在解析源代碼時,XDoclet 會為每個標簽建立一個屬性,并將該屬性附加到結(jié)構(gòu)模型的代碼元素上。現(xiàn)在,請注重 ;@dw.genStruts 標簽,因為這是在本例中將用到的第一個模板。
  
  生成另外一個 Java 類
  
  對于本例,您需要生成新的 Java 類的代碼 —— 一個 Struts 表單 bean。Struts 會用這個 bean 保存并傳輸用戶輸入。bean 必須以 bean 屬性的形式包含所有數(shù)據(jù)字段,而且它必須是 org.apache.struts.action.ActionForm 的子類。
  
  為了生

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴宁市| 新绛县| 麦盖提县| 深泽县| 双桥区| 兰考县| 铜川市| 白银市| 平潭县| 石门县| 南丰县| 德安县| 长兴县| 长春市| 萍乡市| 石嘴山市| 宝兴县| 安丘市| 乌兰县| 通山县| 昂仁县| 化德县| 内乡县| 祁连县| 桑植县| 松溪县| 临朐县| 黎城县| 鹤岗市| 新晃| 周至县| 开江县| 许昌县| 富阳市| 涿州市| 将乐县| 手游| 揭西县| 赣州市| 连南| 崇左市|