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

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

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

Serializable接口是什么意思?


当前回答

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

其他回答

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编译器甚至不允许它这样做)

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

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

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

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

实现序列化具有公共无参数构造函数所有财产都是私有的,使用公共getters和setter方法。

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

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

它应该实现可序列化接口(Marker接口)。构造函数应该是公共的,并且没有参数(其他人称之为“无参数构造函数”)。它应该有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;
}}

JavaBean是JavaBeans体系结构中的一个组件或基本构建块。JavaBeans体系结构是一种组件体系结构,它受益于基于组件的方法的可重用性和互操作性。

有效的组件体系结构应允许程序从软件构建块(在本例中为Beans),可能由不同的供应商提供,也使架构师/开发人员能够选择组件(Bean),了解其功能,并将其合并到应用程序中。

因为类/对象是像Java这样的OOP语言的基本构建块,所以它们是JavaBeans体系结构中Bean的自然竞争者。

将普通Java类转换为Javabean的过程实际上只不过是使其成为可重用和可互操作的组件。这将转化为具有以下功能的Java类:

控制向其他应用程序公开的类的财产、事件和方法。(您可以有一个BeanInfo类,它只报告外部应用程序需要的那些财产、事件和方法。)持久性(可串行化或可外部化-这也意味着没有参数构造函数,对字段使用瞬态)注册事件和生成事件的能力(例如,使用绑定和约束财产)定制器(通过GUI或提供文档来定制Bean)

为了将Java类称为Javabean,它们不需要具备上述所有能力。相反,它意味着实现上述与上下文相关的子集(例如,某个框架中的bean可能不需要自定义程序,其他一些bean可能并不需要绑定和约束的财产,等等)

为了获得上述好处,Java中几乎所有领先的框架和库都隐式地遵循JavaBeans体系结构。