223

我不确定区别。我正在使用 Hibernate,并且在某些书中,他们使用 JavaBean 和 POJO 作为可互换的术语。我想知道是否存在差异,不仅在 Hibernate 上下文中,而且作为一般概念。

4

10 回答 10

268

JavaBean 遵循某些约定。Getter/setter 命名、具有公共默认构造函数、可序列化等。有关更多详细信息,请参阅JavaBeans 约定

POJO(plain-old-Java-object)没有严格定义。它是一个 Java 对象,不需要实现特定接口或从特定基类派生,或使用特定注释以与给定框架兼容,并且可以是任意的(通常相对简单) Java 对象。

于 2009-09-08T14:18:39.540 回答
117

所有 JavaBean 都是 POJO,但并非所有 POJO 都是 JavaBean。

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

  • JavaBean 类必须实现 Serializable 或 Externalizable;
  • JavaBean 类必须有一个公共的无参数构造函数;
  • 所有 JavaBean 属性都必须具有公共的 setter 和 getter 方法(视情况而定);
  • 所有 JavaBean 实例变量都应该是私有的。
于 2014-07-22T11:52:25.830 回答
27

根据 Martin Fowler 的说法,POJO 是一个封装业务逻辑的对象,而 Bean(除了在其他答案中已经说明的定义)只不过是一个用于保存数据的容器,对象上可用的操作只是设置和获取数据。

该术语是在 Rebecca Parsons、Josh MacKenzie 和我准备在 2000 年 9 月的一次会议上发表演讲时创造的。在演讲中,我们指出了将业务逻辑编码为常规 Java 对象而不是使用实体 Bean 的许多好处。我们想知道为什么人们如此反对在他们的系统中使用常规对象,并得出结论,这是因为简单的对象缺乏花哨的名称。所以我们给了他们一个,它很受欢迎。

http://www.martinfowler.com/bliki/POJO.html

于 2015-10-12T07:23:04.777 回答
10

Pojo - 普通的旧 java 对象

pojo类是一个普通类,没有任何特长,类与技术/框架完全松散耦合。该类不从技术/框架实现,也不从技术/框架api扩展,该类称为pojo类。

pojo 类可以实现接口和扩展类,但超类或接口不应该是技术/框架。

例子 :

1.

class ABC{
----
}

ABC 类没有实现或从技术/框架扩展,这就是为什么这是 pojo 类。

2.

class ABC extends HttpServlet{
---
}

ABC 类从 servlet 技术 api 扩展,这就是为什么这不是 pojo 类。

3.

class ABC implements java.rmi.Remote{
----
}

ABC 类从 rmi api 实现,这就是为什么这不是 pojo 类。

4.

class ABC implements java.io.Serializable{
---
}

这个接口是 java 语言的一部分,而不是技术/框架的一部分。所以这是 pojo 类。

5.

class ABC extends Thread{
--
}

这里的线程也是java语言的类,所以这也是一个pojo类。

6.

class ABC extends Test{
--
}

如果 Test 类从技术/框架扩展或实现,那么 ABC 也不是 pojo 类,因为它继承了 Test 类的属性。如果 Test 类不是 pojo 类,那么 ABC 类也不是 pojo 类。

7.

现在这点是个例外

@Entity
class ABC{
--
}

@Entity是 hibernate api 或 jpa api 给出的注释,但我们仍然可以将此类称为 pojo 类。在这种特殊情况下,具有从技术/框架给出的注释的类称为 pojo 类。

于 2017-08-06T07:26:00.433 回答
7

POJO:如果该类可以使用底层JDK执行,而没有任何其他外部第三方库支持,则称为POJO

JavaBean:如果类仅包含带有访问器(setter 和 getter)的属性,则称为 javabeans。Java bean 通常不包含任何业务逻辑,而是用于在其中保存一些数据。

所有 Javabean 都是 POJO,但所有 POJO 都不是 Javabean

于 2017-05-26T05:41:23.653 回答
3

Java bean 是特殊类型的 POJO。

下面列出的专业有原因

在此处输入图像描述

于 2019-11-29T13:08:08.100 回答
2

总结:相同点和不同点是:

   java beans:                          Pojo:
-must extends serializable              -no need to extends or implement.
 or externalizable.                     
-must have public class .               - must have public class
-must have private instance variables.      -can have any access specifier variables.
-must have public setter and getter method. - may or may not have setter or getter method.
-must have no-arg constructor.           - can have constructor with agruments.

所有 JAVA Bean 都是 POJO,但并非所有 POJO 都是 JAVA Bean。

于 2019-03-06T01:01:51.830 回答
1

POJOS具有某些约定(getter/setter、公共无参数构造函数、私有变量)并且正在运行(例如,用于按表单读取数据)是JAVABEANS.

于 2016-04-22T08:54:51.363 回答
1

您已经看到了上面的正式定义,尽管它们是有价值的。

但不要太拘泥于定义。让我们更多地看看这里的事物的感觉

JavaBeans 用于企业Java 应用程序,其中用户经常远程访问数据和/或应用程序代码,即通过网络从服务器(通过Web 或专用网络)访问。因此,所涉及的数据必须以串行格式流入或流出用户的计算机——因此需要 Java EE 对象来实现接口 Serializable。JavaBean 的大部分本质与 Java SE 应用程序对象没有什么不同,Java SE 应用程序对象的数据从文件系统读入或写出到文件系统。通过网络从一系列用户机器/操作系统组合中可靠地使用 Java 类也需要采用约定来处理它们。因此,需要将这些类实现为公共的、具有私有属性、无参数构造函数以及标准化的 getter 和 setter。

Java EE 应用程序还将使用那些作为 JavaBean 实现的类以外的类。这些可用于处理输入数据或组织输出数据,但不会用于通过网络传输的对象。因此,上述考虑不需要应用于它们,除非它们作为 Java 对象有效。后面的这些类称为 POJO - 普通旧 Java 对象。

总而言之,您可以将 Java Bean 视为适合在网络上使用的 Java 对象。

自 1995 年以来,在软件世界中出现了大量的炒作——而且不乏胡言乱语。

于 2018-12-27T17:52:52.960 回答
1

所有 Pojo(s) 都是 JavaBean(s),但并非相反。


什么是 POJO?

  1. POJO 没有属性或方法的命名约定。我们不遵循任何实际的构造、访问、修改类状态的约定。

    例子:

     public class Pojo {
    
      public String firstname;
      public String LASTName;
    
      public String name() {
         return this.firstname + " " + this.LASTName;
      }
     }
    

    在这里,我可以firstnamefirst_nameorFirstname或任何名词代替,变量LASTName.

该术语很可能已获得广泛接受,因为需要一个与复杂对象框架形成对比的通用且易于理解的术语。[2]


使用 POJO 进行反射。

它可能会限制框架支持约定而不是配置、了解如何使用类以及增强其功能的能力。[1]

  List<String> propertyNames =
                Arrays.stream(PropertyUtils.getPropertyDescriptors(Pojo.class))
                        .map(PropertyDescriptor::getDisplayName)
                        .collect(Collectors.toList());
        System.out.println(propertyNames);

如果我们使用第三方库PropertyUtils进行反思,我们可能会遇到问题,因为这将导致

[]

什么是 Java Bean?

JavaBean 仍然是 POJO,但围绕我们如何实现它引入了一组严格的规则:

  • 访问级别——我们的属性是私有的,我们暴露了 getter 和 setter。
  • 方法名称——我们的 getter 和 setter 遵循 getX 和 setX 约定(在布尔值的情况下,isX 可用于 getter)
  • 默认构造函数 - 必须存在无参数构造函数,以便可以在不提供参数的情况下创建实例,例如在反序列化期间
  • Serializable – 实现 Serializable 接口允许我们存储状态。

例子:

@Getter
@Setter
 class Pojo implements Serializable {
    public String firstName;
    public String lastName;
}

使用 Java Bean 进行反射。

如果我们再次使用第三方库如 `PropertyUtils` 进行反射,结果会有所不同
[firstName,lastName]
于 2022-01-20T08:57:56.507 回答