首页 文章

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

提问于
浏览
2

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

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

虽然我试图在各种帖子中找到,但我仍然无法完全理解Java bean是如何有用的,如何通过类跟踪某些规则(从而使它成为bean)使常规Java类无法做到有用?

1 回答

  • 2

    tl;博士

    • Implicit

    • 当类被视为JavaBean时,getter / setter方法命名约定隐式标识属性 .

    • Explicit

    • 或者,您可以通过定义实现BeanInfo接口的合作伙伴类来明确标识这些属性 .

    • 在Java 9及更高版本中,您可以使用annotations更方便地实现 BeanInfo .

    详情

    JavaBeans spec原本应该是"a reusable software component that can be manipulated visually in a builder tool",例如拖放IDE表单构建工具 . 从来没有真正成功 .

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

    JavaBean至少必须:

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

    JavaBean命名约定

    定义JavaBean的隐式方法是通过命名约定 . get / introspection检测到以 getsetis 开头的任何方法,并将其视为标识属性 . 虚构属性可能会或可能不会被类上的成员变量支持 .

    如果 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标准正在成为一种流行的方式,用于声明和实施对象内数据值条件的业务规则 . 例如,规则可能是"eye color is a required field, and must not be null or empty string"或"invoice total must be zero or positive, never a negative number" .

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

    Enterprise JavaBeans

    不要将JavaBeans与Enterprise JavaBeans (EJB)混淆 . 对于EJB重用“JavaBean”商标是Sun营销人员的糟糕决定 . EJB完全不连接,与原始JavaBeans不同 .

相关问题