亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

設計心得——用 XDoclet 減少代碼膨脹

2019-11-18 13:05:47
字體:
來源:轉載
供稿:網友

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

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

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

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

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

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

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

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

  在圖 4 中,您可以看到 XDoclet 與以下內容是緊密相關的:
  
  Apache Ant,它控制著 XDoclet 的操作。XDoclet 是作為一組 Ant 任務存在的,沒有 Ant 則不能執行。
  
  與生成文件關聯的具體問題領域的一些細節。
  
  XDoclet 本身卻是驚人地簡單,正如下面示例中的工作代碼所示的那樣。
  
  使用 XDoclet
  
  現在,您可以通過研究我向您提供的數據入口應用程序示例,來觀察 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 標簽嵌入到注釋中,緊放在相關代碼元素(例如字段、方法、接口或類)的前面。在解析源代碼時,XDoclet 會為每個標簽建立一個屬性,并將該屬性附加到結構模型的代碼元素上?,F在,請注重 ;@dw.genStruts 標簽,因為這是在本例中將用到的第一個模板。
  
  生成另外一個 Java 類
  
  對于本例,您需要生成新的 Java 類的代碼 —— 一個 Struts 表單 bean。Struts 會用這個 bean 保存并傳輸用戶輸入。bean 必須以 bean 屬性的形式包含所有數據字段,而且它必須是 org.apache.struts.action.ActionForm 的子類。
  
  為了生

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美国产制服动漫| 国产成人在线一区| 国产精品电影网| 亚洲第一男人天堂| 国产欧美一区二区三区在线| 成人午夜黄色影院| 精品国产欧美一区二区五十路| 午夜精品久久久久久久99热浪潮| 欧美专区福利在线| 国产成人免费av电影| 91精品国产高清自在线看超| 成人精品在线观看| 精品久久久香蕉免费精品视频| 欧美激情精品久久久久久黑人| 亚洲a区在线视频| 日韩毛片中文字幕| 亚洲欧美三级伦理| 欧美老肥婆性猛交视频| 日本亚洲欧美成人| 一区二区三区黄色| 97久久伊人激情网| 欧美极品xxxx| 亚洲美腿欧美激情另类| 日韩免费视频在线观看| 日韩欧美精品在线观看| 欧美日韩精品在线播放| 亚洲乱码一区av黑人高潮| 精品日本高清在线播放| 91精品在线影院| 亚洲人成在线电影| 国产成人综合一区二区三区| 国产91ⅴ在线精品免费观看| 8090成年在线看片午夜| 亚洲综合最新在线| 国产欧美亚洲精品| 成人免费在线网址| 丝袜情趣国产精品| 久久黄色av网站| 97免费视频在线播放| 91夜夜未满十八勿入爽爽影院| 日韩中文字幕在线免费观看| 性色av一区二区三区免费| 97精品一区二区视频在线观看| 国模私拍一区二区三区| 欧美黄色小视频| 欧美日韩国产丝袜美女| 成人网在线免费看| 国产剧情日韩欧美| 一区二区三区四区在线观看视频| 欧美电影免费观看| 欧美亚洲第一区| 91中文字幕在线| 日韩av观看网址| 亚洲一区二区黄| 精品国产999| 国产日韩精品视频| 欧美国产日韩在线| 欧美国产精品va在线观看| 91精品国产91久久| 欧美日韩国产一中文字不卡| 亚洲成**性毛茸茸| 国产成人一区三区| 亚洲福利视频久久| 欧美体内谢she精2性欧美| 日韩精品中文字幕在线| 日韩国产高清视频在线| 久久久国产一区| 亚洲专区中文字幕| 久色乳综合思思在线视频| 国产精品18久久久久久麻辣| 欧美极品第一页| 国产性色av一区二区| 日韩中文字幕精品| 91国产精品视频在线| 91精品久久久久久久久久久久久久| 国产亚洲精品久久| 亚洲第一二三四五区| 韩曰欧美视频免费观看| 热re99久久精品国产66热| 欧美成人精品h版在线观看| 久久综合久久八八| 伊人男人综合视频网| 91精品久久久久久| 日本人成精品视频在线| 亚洲黄在线观看| 国产精品国模在线| 国产v综合ⅴ日韩v欧美大片| 在线视频日韩精品| 亚洲综合国产精品| 亚洲欧美日韩一区二区三区在线| 久久精品国产视频| 原创国产精品91| 69视频在线免费观看| 日韩精品一区二区三区第95| 日韩欧美精品中文字幕| 国产九九精品视频| 日韩经典中文字幕在线观看| 欧美最猛性xxxxx免费| 26uuu久久噜噜噜噜| 日韩在线欧美在线国产在线| 欧美在线一级视频| 午夜精品福利电影| 欧美精品videossex88| 爽爽爽爽爽爽爽成人免费观看| 亚洲电影免费观看高清完整版在线| 国产成人精彩在线视频九色| 欧美午夜www高清视频| 国产精品美女免费| 亚洲一区二区久久久| 欧美成人免费小视频| 日本成人在线视频网址| 亚洲欧美国产精品专区久久| 日本高清+成人网在线观看| 最近更新的2019中文字幕| 欧美与黑人午夜性猛交久久久| 日韩av免费网站| 亚洲综合在线中文字幕| 亚洲精品美女久久久久| 久色乳综合思思在线视频| 亚洲男人第一网站| 97人人做人人爱| 久久久久成人精品| 亚洲男人天堂手机在线| 国产剧情日韩欧美| 精品偷拍一区二区三区在线看| 亚洲无限av看| 疯狂做受xxxx高潮欧美日本| 久久夜精品香蕉| 国产精品999999| 久久精品男人天堂| 欧美精品亚州精品| 国产a∨精品一区二区三区不卡| 国产亚洲欧洲在线| 欧美日韩国产在线看| 久久精品99国产精品酒店日本| 91久久精品美女| 人人做人人澡人人爽欧美| 日韩在线精品一区| 久久精品成人动漫| 国产999精品| 成人深夜直播免费观看| 国产一区二区三区免费视频| 精品成人乱色一区二区| 久久免费视频在线| 国产在线观看一区二区三区| 最新91在线视频| www.日韩.com| 日韩美女视频在线观看| 欧美日韩不卡合集视频| 欧美怡春院一区二区三区| 国产精品中文字幕在线观看| 久久视频在线免费观看| 欧美成年人视频网站| 欧美激情国产日韩精品一区18| 国产精品揄拍500视频| 奇米成人av国产一区二区三区| 欧美裸身视频免费观看| 亚洲欧洲高清在线| 久久九九国产精品怡红院| 国产成人av网| 色噜噜亚洲精品中文字幕| 久久久久成人网| 夜夜嗨av一区二区三区四区| 欧美精品videosex性欧美|