什么是 JavaBean?

我认为,“Bean” 是具有属性和 getter / setter 的 Java 类。据我了解,它等效于 C 结构。真的吗?

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

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

还有Serializable接口是什么意思?

答案

JavaBean 只是一个标准

  1. 所有私有属性(使用getters / setters
  2. 一个公开的无参数构造函数
  3. 实现Serializable

而已。这只是一个约定。尽管很多图书馆都依赖它。

关于Serializable ,请参阅API 文档

通过实现 java.io.Serializable 接口的类,可以启用类的可序列化性。未实现此接口的类将不会对其状态进行序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

换句话说,可序列化的对象可以写入流,因此可以写入文件,对象数据库,甚至任何东西。

而且,JavaBean 和另一个类之间在语法上没有区别 - 如果一个类遵循标准,则该类就是 JavaBean。

之所以有一个术语,是因为该标准允许库以编程方式对您以预定义方式定义的类实例进行操作。例如,如果一个库要流式传输您传递给它的任何对象,它就知道可以,因为您的对象是可序列化的(假设 lib 要求您的对象是正确的 JavaBeans)。

有一个术语使其听起来特别。现实远没有那么神秘。

基本上是一个 “Bean”:

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

更新:

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

当然,为了做到这一点,班级必须遵守某些限制。其中最主要的是所有实例字段都必须是原始类型(int,bool 等),也可以序列化的某个类的实例或标记为transient以便 Java 不会尝试包括它们。 (当然,这意味着transient字段将无法在流中幸免于难。应准备具有transient字段的类,以在必要时重新初始化它们。)

不能由那些遵守限制类不应该实现Serializable (和,IIRC,Java 编译器甚至不会让它这样做。)

JavaBean 是遵守极其简单的编码约定的 Java 类。您要做的就是

  1. 实现java.io.Serializable接口 - 保存对象的状态
  2. 使用公共的空参数构造函数 - 实例化对象
  3. 提供公共的 getter / setter 方法 - 获取和设置私有变量(属性)的值。

JavaBeans 的属性

JavaBean 是满足某些编程约定的 Java 对象:

  1. JavaBean 类必须实现SerializableExternalizable

  2. JavaBean 类必须具有 no-arg 构造函数

  3. 所有 JavaBean 属性必须具有公共 setter 和 getter 方法

  4. 所有 JavaBean 实例变量都应该是私有的

JavaBeans 的例子

@Entity
public class Employee implements Serializable{

   @Id
   private int id;
   private String name;   
   private int salary;  

   public Employee() {}

   public Employee(String name, int salary) {
      this.name = name;
      this.salary = salary;
   }
   public int getId() {
      return id;
   }
   public void setId( int id ) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName( String name ) {
      this.name = name;
   }
   public int getSalary() {
      return salary;
   }
   public void setSalary( int salary ) {
      this.salary = salary;
   }
}

举例说明。

1. 导入 java.io.Serializable

至于序列化,请参阅文档

2. 私人领域

字段应为私有字段,以防止外部类轻松修改这些字段。代替直接访问那些字段,使用通常的 getter / setter 方法。

3. 构造函数

一个没有任何参数的公共构造函数。

4. 吸气器 / 吸气器

用于访问和修改私有字段的 Getter 和 setter 方法。

/** 1. import java.io.Serializable */
public class User implements java.io.Serializable {
    /** 2. private fields */
    private int id;
    private String name;

    /** 3. Constructor */
    public User() {
    }
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    /** 4. getter/setter */
    // getter
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    // setter
    public void setId(int id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
}

Java Bean 用于更少的代码和更多的工作方式... Java Bean 在整个 Java EE 中都被用作运行时发现和访问的通用合同。例如,JavaServer Pages(JSP)使用 Java Bean 作为页面之间或 Servlet 和 JSP 之间的数据传输对象。 Java EE 的 JavaBeans 激活框架使用 Java Bean 将对 MIME 数据类型的支持集成到 Java EE 中。 Java EE 管理 API 使用 JavaBeans 作为 Java EE 环境中要管理的资源检测的基础。

关于序列化:

在对象序列化中,对象可以表示为字节序列,其中包括对象的数据以及有关对象类型和存储在对象中的数据类型的信息。

将序列化的对象写入文件后,可以从文件中读取并反序列化它,即表示对象及其数据的类型信息和字节可用于在内存中重新创建对象。

在跨多个服务器部署项目时,您会发现序列化很有用,因为 Bean 将被持久化并在它们之间传输。

Java Beans 是一种标准,其他答案已经清楚地说明了其基本语法要求。

但是,IMO 不仅仅是一个简单的语法标准。 Java Bean 的真正含义或预期用途与围绕标准的各种工具支持一起,可促进代码重用和基于组件的软件工程,即使开发人员能够通过组装现有组件(类)来构建应用程序,而无需编写任何组件。代码(或者只需要写一点胶水代码)。不幸的是,该技术被业界低估和未充分利用,可以从该主题的答案中得知。

如果您阅读 Oracle 的Java Bean 教程 ,则可以更好地理解它。

根据维基百科:

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

  2. 根据标准命名约定,必须使用 get,set,is(可用于布尔属性而不是 get)和其他方法(所谓的访问器方法和 mutator 方法)访问类属性。这样可以轻松自动地检查和更新框架中的 Bean 状态,其中许多框架都包含针对各种类型的属性的自定义编辑器。设置器可以有一个或多个参数。

  3. 该类应可序列化。 [这允许应用程序和框架以独立于 VM 和平台的方式可靠地保存,存储和还原 Bean 的状态。]

有关更多信息,请单击此链接。

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