1. 程式人生 > >註解:XML 和 Annotation 的優缺點

註解:XML 和 Annotation 的優缺點

當前許多java框架中大量使用註解,如Hibernate、Jersey、Spring。

什麼是元資料 Metadata

元資料(Metadata),又稱中介資料、中繼資料,為描述資料的資料(data about data),主要是描述資料屬性(property)的資訊,用來支援如指示儲存位置、歷史資料、資源查詢、檔案記錄等功能。

元資料是指從資訊資源中抽取出來的用於說明其特徵、內容的結構化的資料(如題名、版本、出版資料、相關說明、檢索點等),用於組織、描述、檢索、儲存、管理資訊和知識資源。

任何檔案系統中的資料都分為資料和元資料。資料是指普通檔案中的實際資料,而元資料指用來描述一個檔案的特徵的系統資料,諸如訪問許可權、檔案擁有者以及檔案資料塊的分佈資訊(inode…)等等。在叢集檔案系統中,分佈資訊包括檔案在磁碟上的位置以及磁碟在叢集中的位置。使用者需要操作一個檔案必須首先得到它的元資料,才能定位到檔案的位置並且得到檔案的內容或相關屬性。

HTML的head裡有一個meta標籤。那麼它是什麼呢?根據上面的解釋,我們應該知道它是“關於文件的資訊”了。meta的屬性有兩種,name和http-equiv,name屬性用來描述網頁的內容,http-equiv屬性指示伺服器在傳送實際的文件之前先在要傳送給瀏覽器的 MIME 文件頭部包含名稱/值對,比如用以說明主頁製作所使用的文字以及語言。

以下為百度和新浪首頁的meta標籤:

  1. //百度首頁meta標籤

  2. <meta http-equiv="content-type" content="text/html;charset=utf-8">

  3. <meta http-equiv="X-UA-Compatible" content="IE=Edge">

  4. <meta name="referrer" content="always">

  5. <meta name="theme-color" content="#2932e1">

  6. //新浪首頁部分meta標籤

  7. <meta name="keywords" content="新浪,新浪網,SINA,sina,sina.com.cn,新浪首頁,門戶,資訊" />

  8. <meta name="description" content="新浪網為全球使用者24小時提供全面及時的中文資訊,***。" />

  9. <meta name="application-name" content="新浪首頁"/>

基於元資料的廣泛應用,JDK5.0引入了Annotation的概念來描述元資料。

為什麼要引入 Annotation

使用Annotation之前,XML被廣泛的應用於描述元資料。不知何時開始一些應用開發人員和架構師發現XML的維護越來越糟糕了。他們希望使用一些和程式碼緊耦合的東西,而不是像XML那樣和程式碼是鬆耦合的(在某些情況下甚至是完全分離的)程式碼描述。如果你在Google中搜索“XML vs. annotations”,會看到許多關於這個問題的辯論。最有趣的是XML配置其實就是為了分離程式碼和配置而引入的。上述兩種觀點可能會讓你很疑惑,兩者觀點似乎構成了一種迴圈,但各有利弊。下面我們通過一個例子來理解這兩者的區別。

假如你想為應用設定很多的常量或引數,這種情況下,XML是一個很好的選擇,因為它不會同特定的程式碼相連。如果你想把某個方法宣告為服務,那麼使用Annotation會更好一些,因為這種情況下需要註解和方法緊密耦合起來,開發人員也必須認識到這點。

另一個很重要的因素是Annotation定義了一種標準的描述元資料的方式。在這之前,開發人員通常使用他們自己的方式定義元資料。例如,使用標記interfaces,註解,transient關鍵字等等。每個程式設計師按照自己的方式定義元資料,而不像Annotation這種標準的方式。

目前,許多框架將XML和Annotation兩種方式結合使用,平衡兩者之間的利弊。

XML 和 Annotation 的優缺點

目前 web 應用中幾乎都使用 xml 作為配置項,xml 之所以這麼流行,是因為它的很多優點是其它技術的配置所無法替代的。

xml的優點:

  • xml 作為可擴充套件標記語言最大的優勢在於開發者能夠為軟體量身【定製】適用的標記,使程式碼更加通俗易懂。
  • 利用 xml 配置能使軟體更具擴充套件性。例如 Spring 將 class 間的依賴配置在 xml 中,最大限度地提升應用的可擴充套件性。
  • 具有成熟的驗證機制確保程式正確性。利用 Schema 或 DTD 可以對 xml 的正確性進行驗證,避免了非法的配置導致應用程式出錯。
  • 修改配置而無需變動現有程式。

雖然有如此多的好處,但畢竟沒有什麼萬能的東西,xml 也有自身的缺點。

xml的缺點:

  • 需要解析工具或類庫的支援。
  • 解析 xml 勢必會影響應用程式效能,佔用系統資源。
  • 配置檔案過多導致管理變得困難。
  • 編譯期無法對其配置項的正確性進行驗證,或要查錯只能在執行期。
  • IDE 無法驗證配置項的正確性。
  • 查錯變得困難,往往配置的一個手誤導致莫名其妙的錯誤。
  • 開發人員不得不同時維護程式碼和配置檔案,開發效率變得低下。
  • 配置項與程式碼間存在潛規則。改變了任何一方都有可能影響另外一方。

Annotation 的優點:

  • 儲存在 class 檔案中,降低維護成本。
  • 無需工具支援,無需解析。
  • 編譯期即可驗證正確性,查錯變得容易。
  • 提升開發效率。

Annotation的缺點:

  • 若要對配置項進行修改,不得不修改 Java 檔案,重新編譯打包應用。
  • 配置項編碼在 Java 檔案中,可擴充套件性差。

沒有一個事物是萬能的,同樣 xml 和 java Annotation 都有各自的優缺點。且他們的優缺點恰恰是互補的,xml 的強項是 Annotation 所不具備的,而 Annotation 的優勢也是 xml 所欠缺的。這也正是時下流行的 xml + Annotation 配置的原因所在。