首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

EJB 3 註解完整參考:狀態管理、依賴注入、生命週期、攔截器與定時服務

     編輯:Java 相關知識

EJB 3 透過註解 (`@Stateless`、`@Stateful` 等) 大幅簡化企業級開發,本文系統整理會話 Bean 類型、介面綁定、JNDI 命名、生命週期回調、攔截器、依賴注入與定時服務核心註解用法。

會話 Bean 類型宣告

註解類型特徵
`@Stateless`無狀態POJO,容器管理實例池,多用戶共享,不保存會話狀態,生命週期超過單次調用
`@Stateful`有狀態每用戶專屬實例,維持會話狀態,用戶結束即銷毀,支援鈍化/活化

同一 Bean 類可同時標註兩者 (罕見),由客戶端選擇介面決定行為。

本地/遠端介面綁定

  • 預設:實現介面視為 `@Local`
  • 同一 JVM 內調用:優先用 `@Local` 避免 RMI 開銷
  • 跨 JVM/遠端調用:需 `@Remote`
  • 介面標註:`@Local(MyLocal.class)`、`@Remote(MyRemote.class)`

JNDI 命名規則與自定義

預設格式:`耳層名稱/下層名稱` (以 `/` 分隔),預設 JNDI 名 = `Bean名 + 介面類型`

@RemoteBinding(jndiBinding = "com/RemoteHello")
@LocalBinding(jndiBinding = "com/LocalHello")

生命週期回調註解

註解觸發時機適用範圍
`@PostConstruct`實例化後、依賴注入完成有狀態/無狀態
`@PreDestroy`容器銷毀實例前 (池移除/過期)有狀態/無狀態
`@PrePassivate`有狀態 Bean 鈍化前 (閒置超時)僅有狀態
`@PostActivate`有狀態 Bean 活化後 (恢復狀態)僅有狀態
`@Init`有狀態 Bean 初始化 (可多個,按建立方式選擇)僅有狀態
`@Remove`調用標註方法後移除實例僅有狀態

順序:`@PostConstruct` → `@Init` → 業務方法 → `@PrePassivate`/`@PreDestroy`

攔截器機制

  • `@Interceptors(InterceptorClass.class)`:類/方法級指定外部攔截器類
  • `@AroundInvoke`:攔截器方法標註,簽名 `public Object method(InvocationContext ctx) throws Exception`
  • 可在 Bean 內部方法標註 `@AroundInvoke` 實現內部攔截
  • 攔截器鏈按註解順序執行,`ctx.proceed()` 傳遞給下一個

依賴注入

註解用途關鍵屬性
`@EJB`注入 Session Bean 存根`beanName` (類名)、`mappedName` (JNDI 名)
`@Resource`注入任意 JNDI 資源 (DataSource, JMS Queue, Environment Entry)`mappedName`、`name`、`type`、`authenticationType`

Setter 注入模式:

@EJB
public void setHelloBean(HelloBeanLocal bean) { this.helloBean = bean; }

容器在屬性首次使用前自動調用 Setter。

定時服務

  • `@Timeout`:標註定時器回調方法
  • 注入 `SessionContext`:`@Resource SessionContext ctx`
  • 建立定時器:`ctx.getTimerService().createTimer(firstDate, intervalMillis, info)`
  • 參數:`firstDate` (首次觸發時間,過去時間立即觸發)、`intervalMillis` (重複間隔)、`info` (Serializable 附加資料)

部署描述符覆蓋

所有註解均可被 `ejb-jar.xml` 覆蓋,註解為預設值,XML 為最終配置,支援不修改原始碼調整行為。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved