JavaBean和BeanInfo之间有什么关系吗?我读了很多帖子/问题,关于Java Bean,有人提到bean是一个遵循某些规则(私有数据成员、getters()、setters()、实现Serializabe接口……)的常规类。
我正在阅读"Java Complete reference,第8版“一书,偶然发现了BeanInfo,在"Java Beans”一章中。Java Bean与BeanInfo有什么关系?
虽然我试图在各种帖子上找到,但我仍然不能完全理解Java bean是如何有用的,一个类遵循一些规则(从而使它成为一个bean)是如何使它变得有用的,而常规的Java类不能做到这一点?
发布于 2017-02-15 05:34:08
tl;dr
通过定义实现BeanInfo接口的partner类,您可以显式地标识这些属性。
BeanInfo。
详细信息
JavaBeans spec最初的目的是“一个可重用的软件组件,可以在构建器工具中进行可视化操作”,比如拖放式IDE表单构建工具。但这并没有真正解决问题。
相反,人们通常使用JavaBeans方法作为标识属性的一种方式。例如,Vaadin 7中的BeanItemContainer。
至少,JavaBean必须:
与命名约定匹配的获取方法/设置方法( no-args constructor
您可以隐式或显式地定义JavaBean。
JavaBean命名约定
定义JavaBean的隐式方法是通过命名约定。reflection会检测到任何以get、set或is开头的方法,并将其视为标识属性。虚构属性可能确实由类上的成员变量支持,也可能不由该类上的成员变量支持。
如果一个Person类有getEyeColor和setEyeColor方法,那么作为一个JavaBean,我们可以看到一个读写的“eyeColor”属性。没有setter的getter会使该属性成为只读的。
BeanInfo接口
定义JavaBean的显式方法是在您想要的JavaBean类旁边创建另一个类。另一个类实现BeanInfo接口。另一个类实际上很可能是SimpleBeanInfo类的子类。该SimpleBeanInfo类以否定的方式实现BeanInfo接口,拒绝信息。您可以覆盖您想要标识JavaBean类的各个方面的信息片段的方法。
您可以使用BeanInfo合作伙伴类来标识属性(而不是使用getter/setter命名约定)。您还可以识别JavaBean的其他方面。许多其他方面已经过时了,因为它们与JavaBean是一个出现在集成开发环境表单构建工具中的小部件有关,但是您可能仍然会发现一些方面是有用的。
Java语言中的反射/内省功能会自动检测和处理BeanInfo类,以提供关于JavaBean类的元数据。
BeanInfo注解
Java 9可能对JavaBean:annotations的某些方面有所帮助。我还不了解它们的正确用法。我在另一个问题中问过了,。我曾希望这将允许将成员变量注释为属性,以避免编写空的getter/setter方法-但显然该JEP不提供此功能(我不完全确定)。
请参阅OpenJDK项目上的JEP 256: BeanInfo Annotations。
JavaBeans规范
尽管属性肯定是使用JavaBeans的最常见目的,但JavaBeans还有更多的内容,而不仅仅是“eyeColor”这样的属性。
我建议研究一下可读性很好的JavaBeans 1.01 specification。并阅读Oracle Tutorial。
对于技术概述,我建议阅读这篇文章,由Stephen Colebourne撰写的The JavaBeans specification。
Bean验证
在相关注释中,…Bean Validation标准正在成为一种流行的方式,用于声明和强制执行对象中数据值条件的业务规则。例如,规则可能是“眼睛颜色是必填字段,且不能为空或空字符串”或“发票总额必须为零或正数,不能为负数”。
已经有了three versions of the standard ( JSR 349中的1.0、1.1,以及JSR 380中的2.0 )和各种实现。Bean验证可以用于任何客户端(Swing、JavaFX等)。或服务器端。例如,Vaadin在数据输入期间支持自己的验证技术,并支持supporting you plugging in a Bean验证实现。
企业JavaBeans
不要将JavaBeans与Enterprise JavaBeans (EJB)混淆。对EJB重新使用“JavaBean”商标是Sun营销人员的一个糟糕的决定。EJB是完全独立的,与原始的JavaBeans截然不同。
记录
如果您想要的是一种将结构化数据表示为Java对象中的属性的简单方法,请查看Java14中正在预览的新记录功能。请参阅。
记录为声明类提供了紧凑的语法,这些类是浅层不可变数据的透明持有者。
https://stackoverflow.com/questions/24529737
复制相似问题