JavaBean 是「一次編寫、到處執行、到處復用」的軟體元件模型。本文系統闡述其三大任務使命、設計契約與關鍵注意事項。
JavaBean 三大任務使命
- 一次性編寫:元件開發後無需重寫即可增強功能,節省資源、利於版本控制、持續改進不重蹈覆轍
- 任意平台執行:基於 Java 跨平台特性,支援桌面、Web、行動、分散式等多種執行環境
- 任意場景復用:核心差異化價值 — 可嵌入應用程式、其他元件、文件、Web 頁面、建構工具 (GUI Builder、頁面編輯器),這是 JavaBean 與普通 Java 類的本質區別
JavaBean 核心契約 (必須遵守)
- 公共無參建構子:工具自動實例化必要條件
- 屬性存取器命名慣例:`getXxx()` / `setXxx(type)`,Boolean 型可用 `isXxx()`
- 實作 `Serializable`:支援狀態持久化與網路傳輸
- 事件模型:支援 `addXxxListener` / `removeXxxListener` 註冊監聽器
- 無特定繼承要求:視覺化 Bean 需繼承 `java.awt.Component`,非視覺化無限制
三大介面面向 (黑盒模型)
JavaBean 作為黑盒,僅透過三個介面與外部交互:
- 方法:公開業務操作
- 屬性:可讀寫狀態,支援設計時/執行時配置
- 事件:主動通知外部狀態變化
設計注意事項 (避坑指南)
| 禁忌 | 原因 | 替代方案 |
| 在輸出 HTML 中硬編碼字體大小 | 瀏覽器相容性差,部分無法正確渲染 | 使用 CSS 樣式類,外部樣式表控制 |
| 直接輸出 JavaScript/DHTML | 腳本錯誤導致瀏覽器崩潰,調試困難,限制元件壽命 | 最小化腳本輸出,透過標準事件模型交互 |
| 提供過多配置選項 | 增加使用複雜度,違反「慣例優於配置」 | 提供合理預設值,僅暴露核心可變維度 |
視覺化與非視覺化 Bean
- 視覺化:按鈕、滾動條、資料庫檢視表格 — 繼承 `Component`,可拖放至容器
- 非視覺化:資料存取邏輯、計算引擎、驗證規則 — 無 GUI,但建構工具仍可視覺化連線屬性/事件
JavaBean vs 普通 Java 類
| 維度 | JavaBean | 普通 Java 類 |
| 復用目標 | 建構工具、組裝環境、跨專案 | 程式碼層級呼叫復用 |
| 介面契約 | 強規範 (屬性/事件/方法) | 無強制規範 |
| 設計時支援 | 屬性編輯器、屬性表、事件連線 | 無 |
| 部署單元 | JAR + BeanInfo (可選) | JAR / Class 檔 |
現代演進
現代框架 (Spring、Java EE/CDI) 將 JavaBean 概念擴展為 POJO (Plain Old Java Object),保留屬性慣例但移除 `Serializable` 強制、事件模型內建化。核心精神「簡單、標準、可工具化」延續至今。