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. 總結
為了保持軟件工程的清晰結構和部件功能的明確性,以及為了軟件的可擴展性、可移植性和可維護性,建議將這些不同類型的對象分別放置在不同的包中,避免混淆。雖然這樣做可能會增加初始開發的工作量,但從長遠來看,它有助于維護和擴展軟件系統。