我认为,我理解“Bean”是一个具有财产和getters/setter的Java-class。据我所知,它相当于C结构。这是真的吗?

此外,JavaBean和常规类之间是否存在真正的语法差异?是否有特殊定义或接口?

基本上,为什么有一个术语?

Serializable接口是什么意思?


当前回答

JavaBean只是一个标准。它是一个常规的Java类,但它遵循某些约定:

所有财产都是私有的(使用getters/setter)公共无参数构造函数实现可序列化。

就是这样,这只是一个惯例。但许多图书馆都依赖它。

关于Serializable,请参阅API文档:

类的可序列化性由实现java.io.Serializable接口。不实现此功能的类接口将不会序列化或反序列化它们的任何状态。可序列化类的所有子类型本身都是可序列化的。这个序列化接口没有方法或字段,仅用于识别可序列化的语义。

换言之,可序列化对象可以写入流,因此可以写入文件、对象数据库等。

此外,JavaBean和另一个类之间没有语法差异——如果一个类遵循标准,那么它就是JavaBean。

这是一个术语,因为该标准允许库以编程方式处理您以预定义方式定义的类实例。例如,如果一个库想要流式传输您传递给它的任何对象,它知道可以这样做,因为您的对象是可序列化的(假设库要求您的对象为正确的JavaBeans)。

其他回答

有一个术语可以让它听起来很特别。现实远没有那么神秘。

基本上,一个“憨豆”:

是一个可串行化的对象(即,它实现java.io.serializable,并正确执行)具有“财产”,其getter和setter只是具有特定名称的方法(例如,getFoo()是“Foo”属性的getter),并且有一个公共的零参数构造函数(因此可以随意创建并通过设置其财产进行配置)。

至于Serializable:这只是一个“标记接口”(一个不声明任何函数的接口),它告诉Java实现类同意(并暗示它能够)“序列化”——一个将实例转换为字节流的过程。这些字节可以存储在文件中,通过网络连接等发送,并且具有足够的信息,允许JVM(至少是一个了解对象类型的JVM)稍后重建对象——可能在应用程序的不同实例中,甚至在整个其他机器上!

当然,为了做到这一点,班级必须遵守某些限制。其中最主要的是,所有实例字段必须要么是原始类型(int、bool等),要么是某些类的实例,也可以是可序列化的,要么标记为瞬时的,这样Java就不会试图包含它们。(这当然意味着瞬态字段将无法在流上运行。如果需要,具有瞬态字段的类应该准备好重新初始化它们。)

不能遵守这些限制的类不应该实现Serializable(而且,IIRC,Java编译器甚至不允许它这样做)

如果您想了解JavaBeans,首先必须了解软件组件。

软件组件

软件组件是运行特定操作的应用程序的一部分。软件组件也可以是服务的一部分。

一个组件是:

已耦合(具有依赖项)Statefull(保存实例变量的状态)不是标准化的,它是为特定的用例而设计的(JavaEEBeans之间的主要区别)在客户端计算机中运行

Java Beans(企业bean)

在Java EE服务器中运行的标准组件包括完成特定服务的不同业务逻辑简化复杂多层分布式系统的开发

JavaBeans更多的是管理大系统的概念。这就是为什么他们需要标准化。

来源

上面重复了6或7次,说明JavaBeans没有参数构造函数要求。

这是错误的,没有这样的要求,特别是在JavaSpring的上下文中。

描述JavaBeans API的规范版本(1.01)中也没有提到这一要求(https://download.oracle.com/otndocs/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/). 此外,本规范在以下上下文中仅2次提到“null构造函数”:“每个自定义程序都应有一个空构造函数。”“每个PropertyEditor都应有一个空构造函数。”

因此,该规范的作者似乎不知道或不愿意使用“空构造函数”这一术语,对于JavaBeans本身,仍然没有提及它。

JavaBean只是一个标准。它是一个常规的Java类,但它遵循某些约定:

所有财产都是私有的(使用getters/setter)公共无参数构造函数实现可序列化。

就是这样,这只是一个惯例。但许多图书馆都依赖它。

关于Serializable,请参阅API文档:

类的可序列化性由实现java.io.Serializable接口。不实现此功能的类接口将不会序列化或反序列化它们的任何状态。可序列化类的所有子类型本身都是可序列化的。这个序列化接口没有方法或字段,仅用于识别可序列化的语义。

换言之,可序列化对象可以写入流,因此可以写入文件、对象数据库等。

此外,JavaBean和另一个类之间没有语法差异——如果一个类遵循标准,那么它就是JavaBean。

这是一个术语,因为该标准允许库以编程方式处理您以预定义方式定义的类实例。例如,如果一个库想要流式传输您传递给它的任何对象,它知道可以这样做,因为您的对象是可序列化的(假设库要求您的对象为正确的JavaBeans)。

当在多个服务器上部署项目时,您会发现序列化非常有用,因为bean将在它们之间持久化和传输。