3

JavaBean 和BeanInfo之间有什么关系吗?我阅读了各种帖子/问题和关于 Java Bean 的内容,其中提到 bean 是一个遵循某些规则的常规类(私有数据成员、getters()、setters()、实现Serializabe接口......)。

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

尽管我试图在各种帖子上找到,但我仍然无法完全理解 Java bean 有什么帮助,一个类(从而使其成为一个 bean)遵循一些规则如何使它有帮助,而常规 Java 类不能这样做?

4

1 回答 1

3

tl;博士

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

细节

JavaBeans 规范最初的意思是“一个可重用的软件组件,可以在构建工具中进行可视化操作”,例如拖放式IDE表单构建工具。那从来没有真正解决过。

相反,人们通常使用 JavaBeans 方法作为识别属性的一种方式。例如,BeanItemContainerVaadin 7 中。

JavaBean 至少必须:

您可以隐式或显式定义 JavaBean。

JavaBean 命名约定

定义 JavaBean 的隐式方法是通过命名约定。get任何以、set或开头的方法is都可以通过反射/自省检测并被视为识别属性。虚构的属性可能确实由类上的成员变量支持,也可能不支持。

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

BeanInfo界面

定义 JavaBean 的显式方法是在您想要的 JavaBean 类旁边创建另一个类。另一个类实现了BeanInfo接口。另一个类很可能实际上是该类的子SimpleBeanInfo类。SimpleBeanInfo该类BeanInfo以否定的方式实现接口,拒绝提供信息。您覆盖要识别 JavaBean 类的各个方面的信息片段的方法。

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

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

请参阅Oracle 教程页面

BeanInfo 注解

Java 9可能有助于 JavaBean 的某些方面:注解。我还没有理解它们的正确用法。我在另一个问题中问过,How to use new BeanInfo Annotations in Java 9。我曾希望这将允许将成员变量注释为属性,以避免编写空的 getter/setter 方法——但显然这个 JEP 不提供这个特性(我不完全确定)。

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

JavaBeans 规范

JavaBeans 不仅仅是像“eyeColor”这样的属性,尽管属性肯定是使用 JavaBeans 的最常见目的。

我建议研究可读性很强的JavaBeans 1.01 规范。并阅读Oracle 教程

对于技术概述,我建议阅读这篇文章, Stephen Colebourne的 JavaBeans 规范

Bean 验证

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

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

企业 JavaBeans

不要将 JavaBeans 与Enterprise JavaBeans (EJB)混淆。为 EJB 重新使用“JavaBean”商标是 Sun 营销人员的一个错误决定。EJB 与原来的 JavaBeans 完全没有联系和不同。

记录

如果您想要一种将结构化数据表示为 Java 对象中的属性的简单方法,请查看 Java 14 中预览的新记录功能。请参阅JEP 359

记录为声明类提供了一种紧凑的语法,这些类是浅层不可变数据的透明持有者。

于 2017-02-14T21:34:08.180 回答