普通旧 Java 对象 (POJO) 的含义是什么?

2022-08-31 13:42:43

术语 Plain Old Java Object (POJO) 是什么意思?我找不到任何足够解释的东西。

POJO的维基百科页面说POJO是一个普通的Java对象,而不是一个特殊的对象。现在,在Java中,什么使和对象变得特别,或者什么使对象变得特别?

上面的页面还说,POJO不应该扩展预先指定的类,实现预先指定的接口或包含预先指定的注释。这是否也意味着POJO不允许实现像 这样的接口,或者像小程序这样的类或任何其他用户编写的类/接口?SerializableComparable

此外,上述政策(不扩展,不实现)是否意味着我们不允许使用任何外部库?

POJO究竟在哪里使用?

编辑:更具体地说,我是否允许扩展/实现属于Java或任何外部库的类/接口?


答案 1

普通的旧 Java 对象该名称用于强调给定对象是普通的 Java 对象,而不是 EJB 2 框架定义的特殊对象。

类 A {}
类 B 扩展/实现 C {}

注意:当C是分布式框架类或ifc时,B是非POJO。例如 javax.servlet.http.HttpServlet, javax.ejb.EntityBean 或 J2EE extn,而不是 serializeable/comparable。由于可序列化/可比较对 POJO 有效。

这里的A是独立的简单对象。B 是一个特殊的 obj,因为 B 正在扩展/实现 C。因此,B对象从C中获得了更多的意义,而B则限制遵循C的规则,而B则与分布式框架紧密耦合。因此,B对象不是POJO从其定义。

使用类 A 对象引用的代码不必知道有关其类型的任何内容,并且可以与许多框架一起使用。

因此,POJO不应该1)扩展预先指定的类和2)实现预先指定的接口。

JavaBean 是 POJO 的一个示例,它是可序列化的,具有无参数构造函数,并允许使用遵循简单命名约定的 getter 和 setter 方法来访问属性。

POJO纯粹专注于业务逻辑,不依赖于(企业)框架。这意味着它具有业务逻辑的代码,但是如何创建此实例,此对象属于哪个服务(EJB..)以及它的特殊特征(有状态/无状态)将由框架使用外部xml文件决定。

示例 1:JAXB 是将 java 对象表示为 XML 的服务;这些java对象很简单,并提出了默认的构造函数getters和setter。

示例 2:休眠,其中简单的 java 类将用于表示表。列将是其实例。

示例 3:REST 服务。在REST服务中,我们将有服务层和Dao层来执行一些基于DB的操作。因此,Dao将具有特定于供应商的查询和操作。服务层将负责调用哪个 DAO 层来执行数据库操作。DAO的创建或更新API(方法)将以POJO作为参数,并更新POJO并插入/更新到DB中。这些 POJO(Java 类)将只有每列及其 getter 和 setter 的状态(实例变量)。

在实践中,有些人认为注释很优雅,而他们认为XML冗长,丑陋且难以维护,但其他人发现注释污染了POJO模型。因此,作为XML的替代方案,许多框架(例如Spring,EJB和JPA)允许使用注释代替或补充XML:

优点:
将应用程序代码与基础结构框架分离是使用 POJO 的众多好处之一。使用 POJO 可将应用程序与易失性、不断发展的基础架构框架分离,从而满足应用程序业务逻辑的未来需求。升级到新版本或切换到其他框架变得更容易,风险更低。POJO还使测试更容易,从而简化和加速了开发。您的业务逻辑将更清晰、更简单,因为它不会与基础架构代码纠缠不清

参考资料 : 维基源码2


答案 2

根据Martin Fowler的说法,他和其他一些人提出了它来描述标准类而不是EJB等的东西。