三種主流開發模式對比
| 模式 | 工具 | 優點 | 缺點 | 適用場景 |
| 手工構建 | JCreator/EditPlus + Ant/Batch | 理解本質、無依賴、適合學習 | 效率低、易出錯、發布繁瑣 | 教學、簡單項目、無 IDE 環境 |
| IDE 集成 | JBuilder/IntelliJ/Eclipse + 插件 | 智能提示、一鍵部署、調試集成 | 依賴特定 IDE、配置複雜 | 企業級開發、團隊協作 |
| 建模驅動 (MDA) | Together ControlCenter / RSA | 需求可追溯、代碼生成、多平台部署 | 學翐曲線陡、工具昂貴、過度設計風險 | 大型系統、長期維護、嚴格流程 |
模式一:手工構建完整流程
目錄結構
project/
├── src/ # Java 源碼
│ └── com/myapp/ejb/
├── deployment/ # 部署描述符
│ ├── ejb-jar.xml
│ └── weblogic-ejb-jar.xml
├── classes/ # 編譯輸出
│ └── META-INF/ # 部署描述符複製至此
├── lib/ # 生成的 JAR/EAR
└── compilejar.bat # 構建腳本
構建腳本 (compilejar.bat)
@echo off
mkdir classes
mkdir lib
mkdir classes\META-INF
copy deployment\*.xml classes\META-INF\
javac -d classes -cp "%CLASSPATH%" src\*.java
cd classes
jar cf ..\lib\temp.jar *
cd ..\lib
REM WebLogic EJB 編譯器(預編譯生成存根/骨架)
java weblogic.ejbc -keepgenerated temp.jar MyAppEJB.jar
del temp.jar
cd ..
關鍵點
weblogic.ejbc:預編譯器,生成容器所需輔助類
- 舊版本用
weblogic.ejbc20
- JBoss 等容器採用運行時反射,無需預編譯
模式二:IDE 集成開發 (以 JBuilder + WebLogic 為例)
集成配置步驟
- 安裝 JBuilder Enterprise 版
- 配置 WebLogic 集成:Tools → Configure Servers → Add WebLogic
- 項目屬性 → EJB Module → 綁定 WebLogic 部署描述符
- 使用 EJB 設計器可視化創建 Bean、關係、查詢
- 一鍵部署:Run → Deploy to WebLogic
優勢
- 同步編輯 Java 源碼與部署描述符
- 圖形化 CMP 字段映射、關係建模
- 內嵌調試器:斷點、變量檢查、EJB 容器事件追蹤
- 自動處理
ejbc、打包、部署全流程
模式三:建模驅動開發 (Together ControlCenter)
核心工作流
需求分析 → 用例圖
↓
領域建模 → 類圖 (領域模型)
↓
架構設計 → 組件圖、部署圖
↓
詳細設計 → 序列圖、狀態圖
↓
代碼生成 → EJB 完整源碼 + 部署描述符
↓
部署驗證 → 一鍵發布到 WebLogic/JBoss/WebSphere
↓
往復工程 → 代碼修改自動同步回模型
關鍵特性
- LiveSource:模型與代碼雙向同步,非一次性生成
- 模式驅動:應用 EJB 設計模式(Session Facade、Value Object、DAO 等)
- 多服務器支持:同一模型部署到 WebLogic/JBoss/WebSphere,生成對應描述符
- 審計與度量:耦合度、複雜度、命名規範自動檢查
EJB 核心開發模式 (代碼層面)
Session Facade
// 統一業務入口,封裝 Entity Bean 訪問
@Stateless
public class OrderFacadeBean implements OrderFacade {
@EJB CustomerDAO customerDAO;
@EJB OrderDAO orderDAO;
public OrderDTO createOrder(CustomerDTO customer, List items) {
// 事務邊界在此
Customer c = customerDAO.find(customer.getId());
Order o = new Order(c);
for (ItemDTO dto : items) {
o.addLine(new OrderLine(dto.getProductId(), dto.getQty()));
}
return orderDAO.save(o).toDTO();
}
}
Value Object (DTO)
// 遠程接口傳輸數據,避免細粒度遠程調用
public class OrderDTO implements Serializable {
private Long id;
private String customerName;
private List lines;
private BigDecimal total;
// getter/setter
}
Local Interface 優化
// 同一 JVM 內調用,避免 RMI 開銷
@Local
public interface OrderDAOLocal {
Order save(Order order);
Order findById(Long id);
}
@Stateless
public class OrderDAOBean implements OrderDAOLocal { ... }
遷移建議:從 EJB 2.x 到 3.x / Spring
| EJB 2.x 痛點 | 現代解決方案 |
| Home/Remote 接口繁瑣 | 無接口視圖 / @LocalBean |
| Entity Bean CMP 複雜 | JPA (Hibernate/EclipseLink) |
| 部署描述符龐大 | 注解配置 / XML 可選 |
| 重量級容器 | Spring / CDI 輕量級容器 |
| 測試困難 | Spring Test / Arquillian / Embedded EJB |
理解三種開發模式的演進脈絡,有助於在技術選型時平衡學習成本、開發效率、長期維護性。現代 Java 企業級開發以 Spring Boot + JPA 為主流,EJB 歷史經驗仍為架構設計提供寶貴借鑑。