JavaBean 究竟是什么?

2346

我认为“Bean”是一个具有属性和Getter/Setter的Java类。据我所知,它相当于C语言中的结构体。这是真的吗?

此外,JavaBean与普通类之间是否存在真正的语法区别?
是否有特殊的定义或接口?

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

另外,“Serializable”接口是什么意思?


25
查看Java Beans的使用场景?,Java Beans是遵循特定约定的类。 - Matthew Flaschen
12
为了完整起见,这里提供了一个链接,指向JavaBeans规范。 - informatik01
7
请注意,如果你听到有人使用 POJO 这个术语,他们通常实际上是指 Bean。当你看到 POJO 时,它们几乎总是具有设置器和获取器、可序列化等特性... 实际上,POJO 不需要设置器和获取器、可序列化接口或任何其他东西--它只是一个没有特定要求的普通Java对象。 - Bill K
1
绝对不是一个结构体,但我很高兴你问了这个问题。 - Don Rolling
23个回答

11

根据维基百科:

  1. 该类必须具有公共默认构造函数(无参数)。这允许在编辑和激活框架内轻松实例化。

  2. 该类属性必须可通过 get、set、is(可用于布尔属性而不是 get)和其他方法(称为访问器方法和变异器方法)按照标准命名约定进行访问。这允许在各种框架内轻松自动检查和更新 bean 状态,其中许多包括各种类型属性的自定义编辑器。Setters 可以有一个或多个参数。

  3. 该类应该是可序列化的。(这允许应用程序和框架以与 VM 和平台无关的方式可靠地保存、存储和恢复 bean 的状态。)

要了解更多信息,请访问 link


1
之前的回答已经涵盖了这个问题,不是吗? - Peter Mortensen
3
我相信OP(以及我们大多数人)来这里是为了解释而不是复制粘贴文本。 - Farid
最有用的答案。我正在寻找每个条件旁边的原因.. 我想我会在这里停止滚动.. 谢谢 - Heila Al-Mogren

8

关于你问题的第二部分,序列化是一种持久化机制,用于将对象存储为一系列有符号字节。简单来说,它可以存储一个对象的状态,以便以后通过反序列化检索它。


7

Java Bean是一个Java类(概念性),应该遵循以下约定:

  1. 它应该有一个无参构造函数。
  2. 它应该是可序列化的。
  3. 它应该提供设置和获取属性值的方法,称为getter和setter方法。

它是可重用的软件组件。它可以将许多对象封装成一个对象,以便从多个位置访问同一对象,并且是易于维护代码的一步。


1
当谈及Java Beans时,我喜欢短语“可重用软件组件”,因为通常Java Beans什么也不做。 - Rodney P. Barbati
@Rodney P. Barbati:是的,但我觉得它看起来像剽窃(尽管搜索没有成功)。在至少2016年、2017年和2018年,OP省略了大部分冠词(请参见其他帖子,例如这个来自2018年的例子),但在这篇文章中,大多数冠词都包括在内。换句话说,这篇文章的写作风格不符合OP 2016年左右的其他帖子的写作风格。 - Peter Mortensen

6
它们可以序列化,具有零参数构造函数,并允许使用getter和setter方法访问属性。"Bean"这个名字被赋予,以概括这个标准,旨在为Java创建可重用的软件组件。根据维基百科
作为您的应用程序的支柱并由Spring IoC容器管理的对象称为bean。Bean是由Spring IoC容器实例化、组装和管理的对象。否则,Bean只是你的应用程序中众多对象之一。根据Spring IoC

6
在此重申6到7次,JavaBeans需要一个无参构造函数的说法是错误的,尤其在Java Spring的情境下更不需要。版本为1.01的JavaBeans API规范说明书(https://download.oracle.com/otndocs/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/)中也没有提到这一要求。此规范仅在以下情况下两次提及'null constructor': "每个自定义程序应具有null构造函数。" "每个PropertyEditor应该具有null构造函数。"
因此,规范的作者似乎知道或愿意使用“null构造函数”这个术语,但对于JavaBeans本身并没有提及。

1
是的,所有的评论都是完全错误的。Java Beans 甚至可以通过 @java.beans.ConstructorProperties 实现不可变性。原始规范已经过时,甚至没有意义。唯一真正的“标准”是在 java.beans.Introspector 中定义的内容。该类所做的唯一逻辑是检查是否存在具有 is/get/set 方法的方法。 - Adam Gent
在深入研究JavaBeans之后,我完全同意这个答案。JavaBeans是Java社区中一个被深度误解的概念。原始的JavaBeans规范没有提到无参构造函数,只是通过适当命名的getter/setter方法来访问字段。这种错误的解释似乎也延伸到了大多数框架中。大多数框架指定它们只能使用JavaBean对象,但实际上它们的意思是要求它们所使用的对象必须遵循JavaBeans规范中设定的getter/setting命名约定。 - Mixed_Signals

4

Java Bean是指满足以下三个条件的任何Java类:

  1. 它应该实现Serializable接口(一个标记接口)。
  2. 构造函数应该是public类型且没有参数(其他人称之为“无参构造函数”)。
  3. 它应该有Getter和Setter方法。

需要注意,serialVersionUID字段对于维护对象状态非常重要。

下面的代码就是Bean:

public class DataDog implements java.io.Serializable {

private static final long serialVersionUID = -3774654564564563L;

private int id;
private String nameOfDog;

// The constructor should NOT have arguments
public DataDog () {}


/** 4. getter/setter */

// Getter(s)
public int getId() {
    return id;
}

public String getNameOfDog() {
    return nameOfDog;
}


// Setter(s)
public void setId(int id) {
    this.id = id;
}

public void setNameOfDog(String nameOfDog) {
    this.nameOfDog = nameOfDog;
}}

3

如果您熟悉C/Golang,那么您从未听说过C bean或Go bean,因为它们具有struct关键字,开发人员可以轻松定义结构类型,而无需编写复杂的面向对象编程(OOP)关键字。

type User struct {
  Name string
  Age int
}

var user User

user.Name = "name"
user.Age = 18

var bytes, err = json.Marshal(user)

Java的一个失误是缺少struct类型,开发者发现这个缺陷很糟糕。

然后Java Bean被发明出来,只是为了让class假装成struct,以平息你的编辑器或编译器对类成员不安全访问的抱怨或呼喊声。


你哭什么?类和结构体有什么区别?JVM的实现不是一样的吗?就像虚函数表一样? - TheRealChx101

2
为了理解JavaBean,您需要注意以下几点:
JavaBean是一个概念性的东西,不能代表具体的类别。
JavaBean是一种开发工具,可以在可重用软件组件的操作中进行可视化。
JavaBean基于Sun JavaBeans规范,并且可以作为可重用组件。其最大特点是可重用性。

2

POJO(普通的 Java 对象):POJOs 是普通的 Java 对象,除了 Java 语言强制规定的限制之外没有其他限制。

序列化:它用于保存对象的状态并在网络上发送。它将对象的状态转换为字节流。我们可以通过称为反序列化的过程从字节流中重新创建 Java 对象。

使您的类实现 java.io.Serializable 接口。并使用 ObjectOutputStream 类的 writeObject() 方法来实现序列化。

JavaBean 类:它是一个特殊的 POJO,具有一些限制(或约定)。

  1. 实现序列化
  2. 具有公共无参构造函数
  3. 所有属性都是私有的,具有公共的 getter 和 setter 方法。

许多框架 - 如 Spring - 使用 JavaBean 对象。


1
如果你想了解Java-Beans,首先你需要了解软件组件。
软件组件是应用程序的一部分,运行特定操作的一部分。软件组件也可以是服务的一部分。
一个组件具有以下特点:
- 耦合(具有依赖性) - 有状态(它保存实例变量的状态) - 不规范化,被设计用于特定的用例(Java-EE Beans的主要区别) - 运行在客户机上
Java Beans(企业Beans)是标准化组件,运行在Java EE服务器中,包括不同的业务逻辑以完成特定的服务,并简化复杂多层分布式系统的开发。
Java Beans更多地是一个管理大型系统的概念。这就是为什么它们需要标准化的原因。

Overview

来源


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接