【问题标题】:What is the difference between a JavaBean and a POJO?JavaBean 和 POJO 有什么区别?
【发布时间】:2010-11-26 12:39:19
【问题描述】:

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

【问题讨论】:

    标签: java terminology pojo


    【解决方案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;
        }
       }
      

      在这里,我可以将firstname 替换为first_nameFirstname 或任何noun,并且与变量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 可用于 吸气剂)
    • 默认构造函数 - 必须是无参数构造函数 存在,因此可以在不提供参数的情况下创建实例,因为 反序列化过程中的示例
    • Serializable - 实现 Serializable 接口允许我们存储状态。

    例子:

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

    使用 Java Bean 进行反射。

    如果我们再次使用第三方库如 `PropertyUtils` 进行反射,结果会有所不同
    [firstName,lastName]
    

    【讨论】:

      【解决方案2】:

      Java bean 是特殊类型的 POJO。

      下面列出的专业有原因

      【讨论】:

        【解决方案3】:

        综上所述:异同为:

           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。

        【讨论】:

          【解决方案4】:

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

          但不要太拘泥于定义。 让我们更多地了解这里的意义

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

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

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

          自 1995 年以来,软件世界中出现了大量的炒作——而且不乏骗局。

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

            • 我认为 POJO 无法实现 Serializable
            • "JavaBean 类必须有一个无参数构造函数;"还要在此处添加 public
            • JavaBean 是可序列化的,这就是为什么 JavaBean 不是 POJO。
            【解决方案6】:

            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 类。

            【讨论】:

              【解决方案7】:

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

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

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

              【讨论】:

                【解决方案8】:

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

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

                【讨论】:

                • 请注意,JavaBean 可以并且通常是 POJO,许多 POJO 实际上是 JavaBean。
                • 不,根据 POJO 的定义,Java Bean 不是 POJO,因为要被视为 Java Bean,类必须遵循某些编码约定(例如,没有参数构造函数,具有以单词“get”和/或“set”开头的方法)或与 BeanInfo 类一起分发。
                • 因为这些是约定,我认为您可以成功地辩称 bean 可以是 POJO(例如,您不是从 JavaBean 接口或类似接口继承)
                • JavaBeans 规范未能将 JavaBean 定义为非常松散的“可重用软件组件”(或类似的)。它不需要有一个无参数的构造函数,不需要以“get”或“set”开头的方法,不需要是可序列化的,甚至不需要是一个类。
                • 用数学术语来说,我们可以说 Javabean 构成了 POJO 的一个子集,因为对 POJO 施加的特定约束使其成为 Javabean。
                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

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

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

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

                  【讨论】:

                    猜你喜欢
                    • 2013-06-03
                    • 1970-01-01
                    • 2014-10-05
                    • 2011-03-10
                    • 2011-12-20
                    • 1970-01-01
                    • 2015-02-22
                    • 2010-10-02
                    • 2011-12-12
                    相关资源
                    最近更新 更多