EJB(Enterprise JavaBeans)是 Java EE(現稱 Jakarta EE)平臺的核心技術之一,用于開發分布式、可擴展、事務性的企業級應用。以下從基礎到高級全面解析 EJB:
一、EJB 基礎概念
1.?定義與角色
EJB 是服務器端組件模型,提供事務管理、安全控制、遠程訪問等企業級服務,無需手動編寫底層代碼。
2.?EJB 類型
- 會話 Bean(Session Bean)
- 無狀態會話 Bean(Stateless):不保存客戶端狀態,適合批量處理、數學計算等。
- 有狀態會話 Bean(Stateful):保存客戶端會話狀態,如購物車。
- 單例會話 Bean(Singleton):全局唯一實例,適合緩存、配置管理。
- 實體 Bean(Entity Bean):已被 JPA(Java Persistence API)取代。
- 消息驅動 Bean(Message-Driven Bean, MDB):異步處理 JMS 消息,解耦服務。
二、EJB 核心組件
1.?接口與實現
- 業務接口:定義客戶端調用的方法(如
Calculator
接口)。 - 實現類:使用
@Stateless
/@Stateful
/@Singleton
注解(如CalculatorBean
)。
2.?生命周期管理
- 容器管理 Bean 的創建、池化、銷毀,無需手動管理內存。
3.?事務管理
- 容器管理事務(CMT):通過
@TransactionAttribute
注解控制事務邊界(如REQUIRED
、REQUIRES_NEW
)。 - Bean 管理事務(BMT):手動控制事務(
UserTransaction
)。
4.?安全機制
- 聲明式安全:通過
@RolesAllowed
注解限制方法訪問權限。 - 編程式安全:通過
EJBContext.isCallerInRole()
檢查權限。
三、EJB 開發流程
1.?開發步驟示例
定義業務接口:
實現無狀態會話 Bean:
import javax.ejb.Stateless;@Stateless
public class CalculatorBean implements Calculator {@Overridepublic int add(int a, int b) {return a + b;}
}
客戶端調用:
import javax.naming.Context;
import javax.naming.InitialContext;public class Client {public static void main(String[] args) throws Exception {Context ctx = new InitialContext();Calculator calculator = (Calculator) ctx.lookup("java:global/ejb-demo/CalculatorBean!com.example.Calculator");int result = calculator.add(5, 3);System.out.println("Result: " + result);}
}
四、高級特性
1.?遠程與本地訪問
- 本地接口:同一 JVM 內調用(
@Local
)。 - 遠程接口:跨 JVM 調用(
@Remote
),需配置 JNDI 和網絡協議。
2.?攔截器(Interceptor)
- 通過
@AroundInvoke
注解實現方法調用前后的切面邏輯(如日志、性能監控)。
3.?定時器服務(Timer Service)
- 使用
@Schedule
注解創建定時任務(如每日數據備份):
@Singleton
public class SchedulerBean {@Schedule(hour = "0", minute = "0")public void dailyBackup() {// 執行備份邏輯}
}
4.?依賴注入(DI)
- 通過
@EJB
注解注入其他 EJB:
@Stateless
public class OrderService {@EJBprivate InventoryService inventoryService; // 注入另一個EJB
}
5.?異步方法調用
- 使用
@Asynchronous
注解實現異步處理:
@Asynchronous
public Future<String> processLargeFile() {// 長時間任務...return new AsyncResult<>("處理完成");
}
五、EJB 與其他技術的關系
- 與 JPA 的結合:通過
@PersistenceContext
注入 EntityManager 管理數據庫操作。 - 與 JMS 的結合:MDB 監聽 JMS 隊列 / 主題,實現消息驅動架構。
- 與 CDI 的結合:使用 CDI(Contexts and Dependency Injection)替代部分 EJB 功能。
六、部署與容器
- 應用服務器:WildFly、GlassFish、WebLogic 等。
- 部署描述符:
ejb-jar.xml
(可選,推薦使用注解)。
七、最佳實踐
- 優先使用無狀態 Bean:提高可擴展性。
- 細粒度事務控制:避免長事務。
- 避免 EJB 循環依賴:通過接口解耦。
- 性能優化:合理配置池大小、使用異步處理。
八、常見問題
- 遠程調用性能:網絡開銷大,優先使用本地調用。
- 事務超時:通過
@TransactionTimeout
調整超時時間。 - JNDI 查找復雜性:使用依賴注入簡化查找。
九、EJB 3.2+ 新特性
- 輕量級 EJB:支持嵌入式容器,減少對重量級應用服務器的依賴。
- WebProfile:簡化 EJB 規范,適用于 Web 應用。
十、與微服務對比
- EJB:適合單體應用,依賴 Java EE 容器,強事務一致性。
- 微服務:分布式架構,松耦合,語言無關,需額外實現服務發現、熔斷等機制。