【问题标题】:JavaBean and relation with BeanInfo, are they related?JavaBean 和与 BeanInfo 的关系,它们有关系吗?
【发布时间】:2014-07-02 11:17:10
【问题描述】:

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

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

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

【问题讨论】:

  • 阅读 Oracle 的 The Tutorial,免费。
  • @BasilBourque:感谢您的指点。谢谢
  • 如果您想了解所有细节,JavaBeans specification 非常容易阅读。
  • 虽然最初的意思是“一个可重用的软件组件,可以在构建器工具中进行可视化操作”,但 JavaBeans 的使用方式不同于表单构建IDE tool。比如作为方便的数据容器,BeanItem,在Vaadin data model中。
  • 顺便说一下,不要将JavaBeansEnterprise JavaBeans (EJB) 混淆。技术上无关。第一个很容易理解,简单的实际应用。第二个……好吧,没那么多。 EJB 完全是另一种野兽,它的名字是由试图利用 Java 技术早期 JavaBeans 最初的嗡嗡声和声誉的营销人员命名的。

标签: java javabeans pojo beaninfo


【解决方案1】:

tl;博士

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

详情

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

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

至少,JavaBean 必须:

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

JavaBean 命名约定

定义 JavaBean 的隐式方法是通过命名约定。任何以getsetis 开头的方法都被reflection/introspection 检测到并被视为标识属性。虚构的属性可能确实由类上的成员变量支持,也可能不支持。

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

BeanInfo接口

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

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

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

Oracle Tutorial page

BeanInfo 注释

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

OpenJDK 项目中查看JEP 256: BeanInfo Annotations

JavaBeans 规范

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

我建议研究一下可读性很强的JavaBeans 1.01 specification。并阅读Oracle Tutorial

对于技术概述,我建议阅读这篇由 Stephen Colebourne 撰写的 The JavaBeans specification 帖子。

Bean 验证

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

three versions of the standardJSR 349 中的 1.0、1.1,JSR 380 中的2.0)和各种实现。 Bean Validation 可用于客户端(Swing、JavaFX 等)或服务器端。例如,Vaadin 支持自己的数据输入验证技术以及 supporting you plugging in Bean 验证实现。

企业 JavaBeans

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

记录

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

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

【讨论】:

    猜你喜欢
    • 2013-10-22
    • 1970-01-01
    • 2015-12-27
    • 2011-07-04
    • 1970-01-01
    • 2010-12-08
    • 2012-02-15
    • 1970-01-01
    • 2019-02-28
    相关资源
    最近更新 更多