麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

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

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

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

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

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

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

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

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

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

  在圖 4 中,您可以看到 XDoclet 與以下內(nèi)容是緊密相關(guān)的:
  
  Apache Ant,它控制著 XDoclet 的操作。XDoclet 是作為一組 Ant 任務(wù)存在的,沒有 Ant 則不能執(zhí)行。
  
  與生成文件關(guān)聯(lián)的具體問題領(lǐng)域的一些細(xì)節(jié)。
  
  XDoclet 本身卻是驚人地簡單,正如下面示例中的工作代碼所示的那樣。
  
  使用 XDoclet
  
  現(xiàn)在,您可以通過研究我向您提供的數(shù)據(jù)入口應(yīng)用程序示例,來觀察 XDoclet 的實(shí)際工作。(要下載這個(gè)示例中使用的 Java 代碼、XDoclet 模板和 Ant 腳本,請(qǐng)單擊本文頂部或底部的 Code圖標(biāo),或者請(qǐng)參閱 下載部分。)我們將從檢查清單 1 所示的 Java 代碼開始,這部分代碼表示了一個(gè)客戶的地址。該地址被編碼成 JavaBean 組件,其中的 XDoclet 標(biāo)簽是以黑體字形式顯示的:
  
  清單 1. 用 XDoclet 標(biāo)簽標(biāo)記的 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 標(biāo)簽嵌入到注釋中,緊放在相關(guān)代碼元素(例如字段、方法、接口或類)的前面。在解析源代碼時(shí),XDoclet 會(huì)為每個(gè)標(biāo)簽建立一個(gè)屬性,并將該屬性附加到結(jié)構(gòu)模型的代碼元素上。現(xiàn)在,請(qǐng)注重 ;@dw.genStruts 標(biāo)簽,因?yàn)檫@是在本例中將用到的第一個(gè)模板。
  
  生成另外一個(gè) Java 類
  
  對(duì)于本例,您需要生成新的 Java 類的代碼 —— 一個(gè) Struts 表單 bean。Struts 會(huì)用這個(gè) bean 保存并傳輸用戶輸入。bean 必須以 bean 屬性的形式包含所有數(shù)據(jù)字段,而且它必須是 org.apache.struts.action.ActionForm 的子類。
  
  為了生

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄色网址在线视频 | 欧美视频一二三区 | 中文字幕欧美专区 | 在线男人天堂 | 国产精品视频久 | 成年人黄色免费网站 | 久久久久九九九女人毛片 | 黄色片网站在线免费观看 | 精品中文字幕在线播放 | av在线大全 | 日本看片一区二区三区高清 | 羞羞答答视频 | 精国产品一区二区三区四季综 | av中文字幕免费在线观看 | 成人羞羞网站入口 | 亚洲骚综合 | 国产一级伦理片 | 国产91中文字幕 | 欧美成人理论片乱 | 羞羞视频免费网站含羞草 | 午夜精品毛片 | 欧美成网 | 国产91极品 | 免费毛片小视频 | 日本在线观看中文字幕 | 精品中文字幕在线观看 | 国产九九在线视频 | 国产午夜精品一区二区三区不卡 | 羞羞的视频在线 | 在线香蕉视频 | 久久99在线 | 免费在线观看亚洲 | 欧美性猛交一区二区三区精品 | 在线免费小视频 | 操皮视频 | 在线免费观看日韩视频 | 中文字幕国产日韩 | 老子午夜影院 | 日韩视频中文 | 国产精彩视频在线 | 中国毛片在线观看 |