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

时间:2014-07-02 11:17:10

标签: java javabeans pojo beaninfo

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

我正在阅读书籍#34; Java完整参考,第8版&#34;并且在关于&#34; Java Beans&#34;的章节中遇到了BeanInfo。 Java Bean与BeanInfo有什么关系?

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

1 个答案:

答案 0 :(得分:2)

TL;博士

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

详细

JavaBeans spec最初的意思是&#34;一个可重复使用的软件组件,可以在构建器工具中以可视方式进行操作。例如拖放IDE表单构建工具。从来没有真正成功。

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

JavaBean至少必须:

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

JavaBean命名约定

定义JavaBean的隐式方法是通过命名约定。 reflection / 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没有提供这个功能(我不完全确定)。

请参阅JEP 256: BeanInfo Annotations项目的OpenJDK

JavaBeans规范

JavaBeans还有很多东西,而不仅仅是像“eyeColor”这样的属性,尽管属性肯定是使用JavaBeans的最常见目的。

我建议学习可读性JavaBeans 1.01 specification。并阅读Oracle Tutorial

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

Bean验证

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

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

Enterprise JavaBeans

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