关于Java:JavaBean到底是什么?

What is a JavaBean exactly?

我认为,"bean"是一个具有属性和吸收器/设置器的Java类。据我所知,它相当于C结构。是真的吗?

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

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

编辑:如果您可以这样做,并添加有关Serializable接口的信息,以及它的含义。

对于你的回答,我非常感激。


JavaBean只是一个标准

  • 所有属性私有(使用getter/setter)
  • 公共无参数构造函数
  • 实现Serializable
  • 就是这样。这只是一个惯例。但是很多图书馆都依赖它。

    对于Serializable,从API文档中:

    Serializability of a class is enabled by the class implementing the
    java.io.Serializable interface. Classes that do not implement this
    interface will not have any of their state serialized or deserialized.
    All subtypes of a serializable class are themselves serializable. The
    serialization interface has no methods or fields and serves only to
    identify the semantics of being serializable.

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

    另外,JavaBean和另一个类没有语法上的区别——如果遵循标准,类就是JavaBean。

    它有一个术语,因为该标准允许库以编程方式处理以预定义方式定义的类实例。例如,如果一个库想要将您传递给它的任何对象进行流式处理,它知道可以,因为您的对象是可序列化的(假设lib要求您的对象是适当的javaBeans)。


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

    基本上,一个"豆子":

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

    更新:

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

    当然,为了做到这一点,班级必须遵守某些限制。其中最重要的是,所有实例字段必须是基元类型(int,bOL等),某些类的实例也是可序列化的,或者标记为EDCOX1(5),这样Java就不会试图包含它们。(当然,这意味着transient油田在河流上无法生存。具有transient字段的类应该准备在必要时重新初始化它们。)

    一个不能遵守这些限制的类不应该实现EDCOX1×0(和IIRC,Java编译器甚至不让它这样做)。


    JavaBeans是遵循非常简单的编码约定的Java类。你所要做的就是

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

  • JavaBeans的特性

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

  • JavaBean类必须实现SerializableExternalizable

  • JavaBean类必须具有无参数构造函数

  • 所有JavaBean属性都必须具有公共的setter和getter方法

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

  • JavaBeans示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    @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;
       }
    }


    Java bean使用更少的代码和更多的工作方法…JavaBean在整个JavaEE中被用作运行时发现和访问的通用契约。例如,JavaServer页面(JSP)使用JavaBean作为页面之间或Servlet和JSP之间的数据传输对象。JavaEE的JavaBeans激活框架使用JavaBean,将MIME数据类型的支持集成到JavaEE中。JavaEE管理API使用JavaBeans作为在JavaEE环境中管理资源的工具的基础。

    关于序列化:

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

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


    举例说明。

    1。导入java.io.serializable

    至于序列化,请参见文档。

    2。私人领域

    字段应该是私有的,以防止外部类轻松地修改这些字段。通常使用getter/setter方法,而不是直接访问这些字段。

    三。构造函数

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

    4。吸气剂/定位器

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    /** 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 = is;
        }
        public void setName(String name) {
            this.name = name;
        }
    }


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


    JavaBean是一个标准,它的基本语法要求已经被其他答案清楚地解释了。

    但是,在IMO中,它不仅仅是一个简单的语法标准。JavaBean的真正含义或预期用途与标准周围的各种工具支持一起,以促进代码重用和基于组件的软件工程,即使开发人员能够通过组装现有组件(类)来构建应用程序,而不必编写任何代码(或者只需编写少量的胶粘代码)。不幸的是,这项技术被行业低估和利用不足,可以从这条线索的答案中得知。

    如果你阅读了Oracle关于Java bean的教程,你可以从中得到更好的理解。


    根据维基百科:

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

  • 根据标准命名约定,类属性必须可以使用get、set、is(可用于布尔属性而不是get)和其他方法(所谓的访问器方法和mutator方法)进行访问。这允许在框架内轻松地自动检查和更新bean状态,其中许多框架包括各种类型属性的自定义编辑器。setter可以有一个或多个参数。

  • 类应该是可序列化的。[这允许应用程序和框架以独立于虚拟机和平台的方式可靠地保存、存储和恢复bean的状态。]

  • 有关详细信息,请访问此链接。


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

  • 它应该有一个无参数的构造函数。
  • 它应该是可序列化的。
  • 它应该提供设置和获取属性值的方法,称为getter和setter方法。
  • 它是一个可重用的软件组件。它可以将多个对象封装到一个对象中,这样就可以从多个位置访问同一个对象,这是实现代码易于维护的一步。


    关于问题的第二部分,序列化是一种持久性机制,用于将对象存储为一个有符号字节序列。不那么正式地说,它存储对象的状态,这样您以后可以通过反序列化来检索它。


    它们是可序列化的,具有零参数构造函数,并且允许使用getter和setter方法访问属性。名称"bean"被赋予包含这个标准,其目的是为Java创建可重用的软件组件。

    构成应用程序主干并由SpringIOC容器管理的对象称为bean。bean是一个由SpringIOC容器实例化、组装和管理的对象。否则,bean只是应用程序中许多对象中的一个。according to弹簧IO。


    Java bean本质上是一个类,将类归类为bean是:

  • 它应该实现可序列化接口(标记接口)。
  • 构造函数应该是公共的,没有参数(其他人称之为无参数构造函数)。
  • 它应该有getter和setter。
  • 请注意,serialversionID字段对于维护对象状态很重要。以下代码符合bean的条件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    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,您需要注意以下几点:JavaBean是一种概念性的东西,不能代表一类特定的东西。

    JavaBean是一种开发工具,可以在可重用软件组件的操作中可视化。

    JavaBean基于Sun JavaBeans规范,可以是可重用组件。它最大的特点是可重用性。


    只是一些关于bean概念的背景/更新。很多其他的答案实际上有什么,但没有那么多的原因。

    它们早在爪哇就被发明,作为建造GUI的一部分。它们遵循易于工具分离的模式,让它们创建一个属性面板,这样您就可以编辑bean的属性。通常,bean属性表示屏幕上的控件(思考x、y、宽度、高度、文本等)。

    您也可以将其视为强类型数据结构。

    随着时间的推移,这些功能对于使用相同访问类型的许多工具(例如,休眠以将数据结构持久化到数据库)变得非常有用。

    随着工具的发展,它们更倾向于注释,而不是分离setter/getter名称。现在大多数系统不需要bean,它们可以使用任何带有注释属性的普通Java对象来告诉它们如何操作它们。

    现在我把bean看作带注释的属性球——它们实际上只对它们携带的注释有用。

    豆子本身不是健康的模式。它们破坏了封装的本质,因为它们将所有属性公开给外部操作,并且在使用它们时,有一种趋势(决不是要求)创建代码来外部操作bean,而不是在bean内部创建代码(违反了"不要向对象索要它的值,请对象为y做一些事情"啊"。使用带有最少getter和no setter的带注释的pojos可以恢复封装,并且具有不可变的可能性。

    顺便说一下,当所有这些事情发生时,有人把这个概念扩展到所谓的企业Java bean。这些是……不同的。它们非常复杂,以至于很多人觉得他们不理解整个bean概念,停止使用这个术语。我想,这就是为什么你通常听到的bean被称为POJOs(因为每个Java对象都是POJO,这在技术上是可以的,但是当你听到有人说POJO时,他们最常想到的是遵循bean模式的东西)。