2011-05-26 53 views
3

我用我的IDE編寫了很多java bean類。另一個人提出了另一種方法。他建議我將一個帶有bean定義的xml文件放入其中。然後,我使用jaxb或xslt在構建時動態生成類。雖然它是一種新穎而有趣的方法,但我認爲它沒有任何主要的好處。從xml動態生成java bean類有什麼好處?

我在這個建議的方法中只看到一個好處:java bean類不需要在配置控制中維護。任何bean更改都只需要xml文件中的更新。

動態生成Java類有什麼主要好處嗎?是否有其他原因爲什麼採取這種方法?

+0

我希望看到JAXB的源代碼完全用XML編寫。因此要編譯JAXB,您必須通過JAXB運行它以生成Java代碼... – gutch 2011-05-26 04:34:54

+0

我最近啓動了一個新項目http://code.google.com/p/bdl/,該項目將在下一個版本中達到穩定版本週。它允許生成包括自定義代碼,屬性約束等的Java Bean。 – 2013-05-25 12:30:13

回答

1

我在項目中使用了Jibx及其生成器。我的經歷混雜。

  1. 使用JAXB的(XJC)發生器通常的情況下,在http://static.springsource.org/spring-ws/site/reference/html/why-contract-first.html 轉換稱爲與XML maked能夠在DB中存儲和檢索以供將來使用,以及使用用於測試案例輸入功能測試。

  2. 使用任何類型的生成器(Jaxb,Jibx,XMLBeans,Custom)可能對大型項目有意義。它允許數據類型的標準化(如BigDecimal用於財務數量,如ArrayList用於所有列表),強制接口(如Serializable或Cloneable)。這實施了良好的實踐並減少了生成文件審查的需求。

  3. 它允許通過XSLT注入代碼或後處理生成的java文件。示例是爲類型爲financialAmount的每個字段,在setter方法內使用特定策略(UP,DOWN,NEAR)將舍入代碼注入到特定小數大小(2,6,9)。強制這種行爲確實減少了錯誤的實例(因爲公司負責的錯誤財務價值)。

缺點是

  1. 通常每個Java類可以是隻有一個bean類。所做的任何定製都將被覆蓋。由於(在我的情況下)發生器綁定到構建過程。每個構建都會生成類。

  2. 您無法在bean類上實現您的自定義接口,或爲自己的或第三方框架添加註釋。

  3. 由於通常會生成默認構造函數,因此無法輕鬆實現像工廠方法這樣的模式。重構通常很困難,因爲發電機通常不支持它。

  4. 您可能(現在還不確定,幾年前Jibx是否屬實)在最適用時無法生成ENUMS。

  5. 無論需要如何,您都可能無法使用自己的默認數據類型覆蓋默認數據類型。 CopyOnWrite列表,而不是ArrayList,用於跨線程共享的變量或實現Observer模式的List自定義實現。

發電機的好處超過了大型(在個人而不是代碼中,認爲150個開發商在三個地點)分佈式項目的成本。您可以通過定義包含該bean的自定義類並實現行爲或後處理(添加附加代碼)以及從XSD註釋或其他配置文件中獲取的其他元數據來解決這些缺點。記住發電機的支持和維護變得至關重要,因爲整個項目都依賴於它。小心使用它。

對於較小規模的項目,我個人會寫我自己的類。對於規模較大的項目,我個人不會在中間層使用它,主要是因爲缺乏重構支持。它可以用於綁定到UI框架的簡單bean。

2

我同意@Akhilss。我的經驗一直在代碼生成很常見的大型Java EE項目中。

這一切都取決於你的項目。如果你只編寫幾個bean並且只需要基本的功能,那麼我不認爲需要從XML開始(反正經常使用它)。特別是如果你實際上不需要XML。

然而,如果你的建築,需要XML,一個例子是一個SOAP Web服務的WSDL和模式的系統,然後產生是一個好主意,因爲它可以節省您從手動保持模式和豆類同步。以及提供工廠類和其他支持代碼。

作爲一個相反的觀點,與EJB3和類似的標準,它現在往往更容易編寫豆類和動態生成的XML凌亂的東西。 IE瀏覽器。讓服務器完成咕嚕作業。

另一個理由認爲代碼生成是,如果你需要在你的豆類更復雜的功能,因爲它們代表了數據結構。幾年前,我試用了Apache Tuscany項目來從XML生成SDO bean。關於這一點的好處是,我可以生成屬性更改通知等功能,所以當我修改任何bean的屬性(包括集合)時,程序的其他部分可以自動通知。像這樣生成的功能可以爲您節省大量時間和金錢,如果您需要的話。

最後,我建議堅持KISS原則。所以不要添加你不需要的東西。從XML生成的代碼是有用的,如果它從長遠來看可以幫助你。但是像任何技術一樣,請確保您正確地添加它。