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 回答
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至少必须:
Be serializable
有no-args constructor
具有与命名约定匹配的getter / setter方法(“mutators”)
您可以隐式或显式定义JavaBean .
JavaBean命名约定
定义JavaBean的隐式方法是通过命名约定 .
get
/ introspection检测到以get
,set
或is
开头的任何方法,并将其视为标识属性 . 虚构属性可能会或可能不会被类上的成员变量支持 .如果
Person
类具有getEyeColor
和setEyeColor
方法,那么作为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 standard(JSR 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不同 .