Java 开发中,你真的了解这些对象的差异与用途吗?

开发 前端
为了保持软件工程的清晰结构和部件功能的明确性,以及为了软件的可扩展性、可移植性和可维护性,建议将这些不同类型的对象分别放置在不同的包中,避免混淆。虽然这样做可能会增加初始开发的工作量,但从长远来看,它有助于维护和扩展软件系统。

1. JavaBean

依据维基百科的阐述,JavaBean 通常是具备以下三种特性的公共 Java 类:

  • 拥有无参构造方法(默认构造方法)。
  • 所有属性均为 private,外部需通过 public 的 getter 和 setter 方法访问属性。
  • 实现 Serializable 接口。

JavaBeans 规范指出,它是一种可在开发工具中可视化编辑的可重用软件组件,包含一系列属性与可能的事件。规范第 7 章规定其属性应为 private,外部通过 public 的 getter 和 setter 访问;第 2 章规定需可序列化以便传输和持久化状态,但未要求必须有无参构造方法。该规范于 1997 年发布,主要围绕 Java Applet 设计,其 GUI 组件有属性和事件且需可序列化,但在纯服务器端开发中,部分对象不适用此定义,如数据库连接或业务逻辑对象可能无需在电脑间传输,至少不适用可序列化特性。

2. EJB

EJB 是企业级 JavaBeans(Enterprise JavaBeans)的缩写。根据 EJB 规范,企业级 Bean 具有以下特性:

  • 通常包含操作企业数据的业务逻辑。
  • 由容器在运行时管理。
  • 用户需通过容器访问。
  • 能在部署时根据运行环境定制。
  • 可通过注解或 XML 在编译或部署时指定配置信息(可配置)。
  • 仅使用 EJB 规范规定服务的企业级 Bean 可在任意 EJB 容器中使用(可移植)。
  • 企业级 Bean 无需重新编译即可封装在企业应用中。

此外,企业级 Bean 可以是有状态或无状态的,能实现业务逻辑或代表持久化实体,与 JavaBean 有较大区别,不一定是 JavaBean,也不一定有无参构造方法和实现 Serializable 接口。同时,规范虽未规定属性必须为 private 及通过 public 的 getter 和 setter 访问,但基于类的封装性和降低耦合考虑,通常会遵循此设计。

3. Spring Bean

根据 Spring Framework 官方文档,在 Spring 中由 Spring IoC 容器管理且构成应用主干的对象即为 bean(IoC 是控制反转 Inverse of Control 的缩写)。Spring beans 由 Spring IoC 容器依据 XML 配置文件或注解等方式进行实例化、组装和管理。它与 EJB 类似,通常包括数据库连接、事务管理器等,区别在于 Spring beans 由 Spring IoC 容器管理,而 EJB 由 EJB 容器管理,且 Spring beans 同样不一定有无参构造方法和实现 Serializable 接口。

4. POJO

POJO 是简单的传统 Java 对象(Plain Old Java Object)的缩写,也有其他类似说法,由 Martin Fowler 等人提出。结合 Spring 文档,POJO 是尽量不依赖第三方库、框架及 JavaEE 规范实现的 Java 对象,应尽量不继承类、不实现接口、不包含相关注解。它与 JavaBeans、EJB 和 Spring beans 无必然联系,具有更高的可维护性和可移植性,开发人员可灵活选择应用场景,不受第三方库或框架升级影响。

5. BO

BO 是业务对象(Business Object)的缩写,用于描述业务逻辑中的对象且不依赖具体实现。其属性应与业务相关人员理解一致,例如用户信息类中的字段命名应符合业务人员认知。同时,一些特定情况下的对象不属于 BO,如处理多对多关系的中间对象。通常 BO 在需求或设计中出现,很少单独编写纯粹的 BO 类,多作为其他对象的基类或组成部分。

6. DTO

DTO 是数据传输对象(Data Transfer Object)的缩写,通常是 JavaBean(满足无参构造方法、private 属性及对应 getter/setter、实现 Serializable 接口),也通常是 POJO,以确保在交互系统间的可移植性。

7. PO

PO 是持久化对象(Persistent Object)的缩写,与数据库表及行对应,通常是 JavaBean,也可能包含 JPA 规范中的注解。在架构设计中,PO 与 DTO 等对象应区分开,因为数据库对象有一些特定字段不应暴露给用户或其他系统。在 Hibernate 中,PO 有持久化对象状态、值对象状态和游离状态三种状态,其状态转换与 Hibernate session 的操作相关。

8. VO

VO 有值对象(Value Object)和展现层对象(View Object)两种含义。在 Hibernate 中,值对象是广义 PO 的一种状态,除持久化和游离状态的广义 PO 外都是值对象;从另一定义看,用于存储数据的对象如 PO 和 DTO 也可称为值对象。展现层对象对应客户端页面或组件中的数据,与 DTO 结构相似,用于业务逻辑层和客户端页面间传输数据,二者是否合并可参考相关博文讨论。

9. DO

DO 表示数据对象(Data Object)。阿里巴巴《Java 开发手册》中的 DO 等同于 PO(一个 DO 类与一个数据库表对应,一个 DO 与数据库表中的一行对应))。

10. DAO

DAO 是数据访问对象(Data Access Object)的缩写,封装数据库实现细节并抽象访问方法,通常依赖注入容器注入数据库连接对象等,所以通常是 EJB 或 Spring bean。

11. 总结

为了保持软件工程的清晰结构和部件功能的明确性,以及为了软件的可扩展性、可移植性和可维护性,建议将这些不同类型的对象分别放置在不同的包中,避免混淆。虽然这样做可能会增加初始开发的工作量,但从长远来看,它有助于维护和扩展软件系统。

责任编辑:武晓燕 来源: 程序猿技术充电站
相关推荐

2021-11-26 08:07:16

MySQL SQL 语句数据库

2018-12-21 11:24:55

Java时间处理编程语言

2023-11-01 13:48:00

反射java

2022-07-26 00:00:22

HTAP系统数据库

2014-04-17 16:42:03

DevOps

2021-01-07 05:40:13

BLE模块Android

2022-01-17 07:32:34

Java参数方法

2025-01-03 08:09:15

2018-04-27 15:30:53

Java三目运算符

2023-04-28 07:49:13

Javawaitsleep

2021-11-09 09:48:13

Logging python模块

2021-01-15 07:44:21

SQL注入攻击黑客

2023-05-10 11:07:18

2014-11-28 10:31:07

Hybrid APP

2019-09-16 08:40:42

2023-03-16 10:49:55

2020-02-27 10:49:26

HTTPS网络协议TCP

2023-12-07 08:13:58

Java开发

2023-06-13 13:52:00

Java 7线程池

2023-07-26 07:41:53

Python线程状态
点赞
收藏

51CTO技术栈公众号