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. 总结
为了保持软件工程的清晰结构和部件功能的明确性,以及为了软件的可扩展性、可移植性和可维护性,建议将这些不同类型的对象分别放置在不同的包中,避免混淆。虽然这样做可能会增加初始开发的工作量,但从长远来看,它有助于维护和扩展软件系统。
相关内容拓展:(技术前沿)
近 10 年间,甚至连传统企业都开始大面积数字化时,我们发现开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。 针对这类问题,低代码把某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子,极大的提高了程序员的生产效率。
推荐一款程序员都应该知道的软件 JNPF 快速开发平台,采用业内领先的 SpringBoot 微服务架构、支持 SpringCloud 模式,完善了平台的扩增基础,满足了系统快速开发、灵活拓展、无缝集成和高性能应用等综合能力;采用 前后端分离模式,前端和后端的开发人员可分工合作负责不同板块,省事又便捷。
体验官网: https://www.jnpfsoft.com
评论