2011-05-26 58 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生成的代码是有用的,如果它从长远来看可以帮助你。但是像任何技术一样,请确保您正确地添加它。