JavaBean和与BeanInfo的关系,它们是相关的吗?

JavaBean和BeanInfo之间有任何关系吗? 我读过各种帖子/问题,关于Java Bean,它提到了bean是一个遵守某些规则的常规类(私有数据成员,getters(),setters(),实现Serializabe接口...)。

我正在阅读“Java Complete reference,8th Edition”一书,并在“Java Beans”一章中遇到了BeanInfo。 Java Bean与BeanInfo有什么关系?

虽然我试图找到各种帖子,但我仍然无法完全理解Java bean是如何有用的,如何遵循一些类的规则(从而使它成为一个bean)使常规Java类无法做到这一点很有用?


TL;博士

  • 含蓄
  • 当类被认为是JavaBean时,getter / setter方法命名约定隐式地标识属性。
  • 明确的
  • 或者,您可以通过定义实现BeanInfo接口的合作伙伴类明确标识这些属性。
  • 在Java 9及更高版本中,您可以使用注释来更方便地实现BeanInfo
  • 细节

    JavaBeans规范最初意味着“可以在构建工具中可视化地操作的可重用软件组件”,例如拖放式IDE构建工具。 这从来没有真正解决。

    相反,人们通常使用JavaBeans方法来识别属性。 例如,Vaadin 7中的BeanItemContainer

    至少,JavaBean必须:

  • 可序列化
  • 有一个无参数构造函数
  • 具有与命名约定匹配的getter / setter方法(“mutators”)
  • 您可以隐式或显式地定义JavaBean。

    JavaBean命名约定

    定义JavaBean的隐含方式是通过命名约定。 任何以getsetis开头的方法get被反射/内省检测到,并被认为是识别一个属性。 这个虚构的属性可能会或可能不会真的被类中的成员变量所支持。

    如果一个Person类具有getEyeColorsetEyeColor方法,那么作为一个JavaBean,我们会看到一个可读写的“eyeColor”属性。 没有setter的getter使属性为只读。

    BeanInfo接口

    定义JavaBean的明确方法是与预期的JavaBean类一起创建另一个类。 另一个类实现BeanInfo接口。 其他类很可能实际上是SimpleBeanInfo类的一个子类。 该SimpleBeanInfo类以否定的方式实现BeanInfo接口,拒绝信息。 您可以覆盖要识别JavaBean类的各个方面的信息的方法。

    您可以使用BeanInfo伙伴类来标识属性(而不是使用getter / setter命名约定)。 并且您可以识别JavaBean的其他方面。 其中很多其他方面都过时了,因为它们与JavaBean相关,它是一个出现在IDE窗体构建工具中的窗口小部件,但您仍然可以发现一些有用的方面。

    Java中的反射/自省设施会自动检测并处理您的BeanInfo类,以提供有关JavaBean类的元数据。

    BeanInfo注释

    Java 9为识别JavaBean的属性和其他方面提供了一种新的非常方便的方式:注释。 您可以简单地将一些注释标签添加到JavaBean类的源代码中,而不是去构建单独的合作伙伴类的麻烦。 您可以通过这种方式识别属性以及识别其他BeanInfo方面。

    请参阅OpenJDK项目上的JEP 256:BeanInfo注释。

    JavaBeans规范

    对于JavaBean来说,除了像eyeColor这样的属性还有很多,尽管属性无疑是使用JavaBeans最常见的目的。

    我建议学习JavaBeans 1.01规范。 并阅读Oracle教程。

    对于技术概述,我建议阅读本文,Stephen Colebourne的JavaBeans规范。

    Bean验证

    在相关说明中... Bean Validation标准正在成为一种流行的方式来声明和实施对象内数据值条件的业务规则。 例如,规则可能是“眼睛颜色是必填字段,且不能为空或空字符串”或“发票总数必须为零或正数,而不是负数”。

    该标准有三种版本(JSR 349中的1.0,1.1和JSR 380中的2.0)以及各种实现。 Bean验证可以在客户端(Swing,JavaFX等)或服务器端使用。 例如,Vaadin在数据输入过程中支持自己的技术进行验证,并支持您插入Bean验证实现。

    Enterprise JavaBeans

    不要将JavaBeans与Enterprise JavaBeans(EJB)混淆。 Sun公司的营销人员做出了一个糟糕的决定,重用EJB的“JavaBean”商标。 EJB与原始JavaBean完全无关并且截然不同。

    链接地址: http://www.djcxy.com/p/47657.html

    上一篇: JavaBean and relation with BeanInfo, are they related?

    下一篇: Can a JavaBean have methods besides getters and setters?