题 什么是JavaBean?


我认为,我认为“Bean”是一个带有属性和getter / setter的Java类。据我所知,它相当于C结构。真的吗?

还有,真的有吗? 句法 bean和普通类之间的区别?有没有特殊的定义或界面?

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

编辑:如果你可以这么善良并添加有关的信息 Serializable 界面,这意味着什么,对你的回答,我将非常感激。


1363
2017-07-21 00:41


起源


看到 Java Bean使用的地方?。这是遵循某些惯例的类。 - Matthew Flaschen
我认为它代表“自足” - Val
为了完整起见,这里有一个链接 JavaBeans规范。 - informatik01
可能重复 什么是“Java Bean”? - KNU


答案:


JavaBean只是一个 标准

  1. 私有的所有属性(使用 getter / setter方法
  2. 公众 无参数构造函数
  3. 器物 Serializable

而已。这只是一个惯例。很多图书馆依赖它。

关于 Serializable, 来自 API文档

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

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

此外,JavaBean与另一个类之间没有语法差异 - 如果JavaBean遵循标准,则该类定义JavaBean。

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


1501
2017-07-21 00:45



在我看来,几乎所有围绕bean的文档都不能像你一样简洁地描述这个术语。 +1 - AndaP
bean的成员是否也需要bean?似乎是一个合理的要求.. - worldsayshi
@worldsayshi - 不,这不是必需的。例如,bean可以包含String;和String不是bean。 (字符串是不可变的,因此您无法通过调用空构造函数和setter来创建它。)Serializable对象应该具有Seri​​alizable成员似乎是合理的,除非它以某种方式从外部序列化它们。所以不,Java bean成员不需要具有Java bean的任何方面。虽然它更多 简单 如果他们也是豆子。 - Viliam Búr
所以豆类基本上是遵循上述三个标准的POJO ??? - KNU
“所有属性私有”都不正确。属性是从getter和setter推断的(如果有一个方法X getFoo() - > bean有一个名为“foo”的可读属性;如果有一个方法setFoo(X foo) - > bean有一个可写的属性叫做“富”)。属性可以由成员字段(但不一定是)支持,这些字段通常是私有的。 - Puce


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

基本上,一个“豆”:

  • 是一个可序列化的对象(也就是说,它实现了 java.io.Serializable,并且正确地这样做了)
  • 有“属性”,其getter和setter只是具有某些名称的方法(例如, getFoo() 是“Foo”属性的吸气剂,和
  • 有一个公共默认构造函数(因此可以随意创建并通过设置其属性进行配置)。

更新:

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

当然,为了做到这一点,班级必须遵守某些限制。其中最主要的是所有实例字段必须是基本类型(int,bool等),某些类的实例也可序列化,或标记为 transient 这样Java就不会尝试包含它们。 (这当然意味着 transient 田地将无法在溪流中度过。有一个类 transient 如有必要,应准备好重新初始化它们。)

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


242
2017-07-21 00:50



这可能是一个愚蠢的问题但是,除了原始类型或类的实例之外,实例字段可以是什么? - kingfrito_5005
@ kingfrito_5005:这将是一个或另一个。但是如果它是一个类的实例,那么该类是否可序列化是很重要的。为了使类可序列化,其非transient 零件必须是一些可序列化的类型。 - cHao


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

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

79
2017-07-21 04:22





JavaBeans的属性

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

  1. JavaBean类必须实现 Serializable 要么 Externalizable 

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

  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;
   }
}

48
2018-01-24 09:33



注释是必需的还是Java Bean的一部分? - giannis christofakis
@giannischristofakis不,注释是没有必要的。注释是Spring Framework的一部分,它广泛使用Java Bean。 - Tianxiang Xiong
为什么需要一个no-arg构造函数? - Renato
@Renato这很简单。想想spring必须用arg-constructor自动实例化你的bean ...它会作为参数传递什么? ;) - Alex75


Java Bean用于更少的代码和更多的工作方法...... Java Bean在整个Java EE中用作运行时发现和访问的通用契约。例如,JavaServer Pages(JSP)使用Java Beans作为页面之间或servlet和JSP之间的数据传输对象。 Java EE的JavaBeans Activation Framework使用Java Bean将MIME数据类型的支持集成到Java EE中。 Java EE Management API使用JavaBeans作为在Java EE环境中管理资源的工具的基础。

关于序列化:

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

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


18
2017-09-23 07:30





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


17
2017-07-21 06:03



您能否提供有关跨多个服务器部署项目的更多信息?谢谢 - Hanfeng
说一个带有几个服务器的集群,对于Websphere这个链接 stackoverflow.com/questions/3193345/... 可能有帮助。 - Truong Ha


用例子说明。

1. import java.io.Serializable

至于序列化,请参阅 文件

私人领域

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

3.构造函数

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

吸气剂/二传手

用于访问私有字段的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 = is;
    }
    public void setName(String name) {
        this.name = name;
    }
}

16
2017-08-22 12:45





根据维基百科:

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

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

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

有关更多信息,请按照此处 链接。


9
2018-06-16 11:41





Java Bean是一种标准,其基本语法要求已由其他答案清楚地解释。

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

如果你读过Oracle的话 关于Java Bean的教程,你可以更好地理解。


8
2018-05-21 15:11



有用的帖子和链接。当我想到bean时,我确实想到了“Visual Builder”类型的东西,如Oracle文章所示。我想知道是否还有很多其他框架在很大程度上使用它们...... - mike rodent