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

EJB 3.0 三大核心組件深度解析:會話、實體、訊息驅動 Bean

     編輯:Java 相關知識

EJB 3.0 範式轉移:POJO + 註解 = 企業級組件

EJB 3.0 摒棄了 2.x 時代繁瑣的 Home/Remote 介面、XML 部署描述符、強制容器管理,轉而採用 **Plain Old Java Object (POJO) + 元數據註解** 模式。開發者專注業務邏輯,容器通過註解提供事務、安全、持久化、依賴注入等企業級服務。

一、會話 Bean:業務流程的執行單元

無狀態會話 Bean (@Stateless)

  • 特徵:不保持會話狀態,實例間無差別,容器管理實例池。
  • 適用場景:單次調用完成的獨立業務邏輯(試算稅費、驗證信用、發送郵件)。
  • 併發模型:容器保證單執行緒訪問實例,但多執行緒可並發調用池中不同實例。
@Stateless(name = "CalculateEJB")
public class CalculateEJBBean implements CalculateEJB {
    private int value = 0; // 警示:無狀態 Bean 不應依賴實例變量保持狀態!
    
    public String incrementValue() {
        value++; // 此處有併發安全隱患,僅作示範
        return "value incremented by 1";
    }
}

有狀態會話 Bean (@Stateful)

  • 特徵:專屬於單一客戶端,維護會話狀態(購物車、向導式流程)。
  • 生命周期:客戶端查找 → 容器創建實例 → 多次業務調用 → @Remove 方法調用 → 容器銷毀實例。
  • 持久化/激活:容器可將閒置實例序列化至磁碟(Passivation),再次調用時反序列化(Activation),需實現 Serializable。
@Stateful
public class ShoppingCartBean implements ShoppingCart {
    private List items = new ArrayList<>();
    
    public void addItem(Item item) { items.add(item); }
    public List getItems() { return items; }
    
    @Remove
    public void checkout() { /* 處理訂單 */ }
}

二、實體 Bean:持久化領域模型的核心

JPA 標準化:@Entity + 映射註解

EJB 3.0 整合 Java Persistence API (JPA),實體 Bean 成為標準 JPA 實體類,可脫離 EJB 容器獨立運行(如 Spring Data JPA、Java SE 環境)。

@Entity
@Table(name = "EMPLOYEES")
public class Employee implements Serializable {
    @Id
    @Column(name = "EMPNO")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int empId;
    
    @Column(name = "ENAME", length = 50)
    private String eName;
    
    @Column(name = "SAL")
    private double sal;
    
    // Getter/Setter 省略...
    
    @Transient // 非持久化字段
    private String displayName;
}

關鍵特性

  • 主鍵策略:@GeneratedValue 支援 IDENTITY、SEQUENCE、TABLE、AUTO 四種生成策略。
  • 關係映射:@OneToMany、@ManyToOne、@ManyToMany、@OneToOne 完整支援雙向/單向關聯。
  • 延遲加載:集合關係預設 LAZY,單值關係預設 EAGER,可通過 fetch 屬性調整。
  • 脫管/合併:EntityManager.detach()、merge() 支援長會話場景。

三、訊息驅動 Bean (MDB):異步訊息處理引擎

核心契約:實現 MessageListener + @MessageDriven

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destinationName", propertyValue = "jms/OrderQueue"),
    @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "ORDER_TYPE = 'URGENT'")
})
public class OrderProcessorMDB implements MessageListener {
    @Resource
    private MessageDrivenContext mdbContext;
    
    @Inject
    private OrderService orderService;
    
    public void onMessage(Message message) {
        try {
            if (message instanceof ObjectMessage) {
                Order order = (Order) ((ObjectMessage) message).getObject();
                orderService.processUrgentOrder(order);
            }
        } catch (JMSException e) {
            // 異常處理:可選重發、死信隊列、告警
            throw new EJBException("訊息處理失敗", e);
        }
    }
}

容器托管服務

  • 併發控制:maxSession 限制並發消費者數量。
  • 事務邊界:預設 REQUIRED,onMessage 失敗自動回滾並重發(依隊列配置)。
  • 訊息確認:容器管理 AUTO_ACKNOWLEDGE,異常拋出時不確認觸發重發。

EJB 客戶端調用模式

JNDI 查找(傳統/遠程)

Context ctx = new InitialContext();
CalculateEJB ejb = (CalculateEJB) ctx.lookup("java:global/app/CalculateEJBBean!rmi.demo.CalculateEJB");
ejb.incrementValue();

依賴注入(同容器內/Managed Bean)

@EJB
private CalculateEJB calculateEJB; // 容器自動注入代理對象

介面分離:Local vs Remote

  • @Local:同 JVM 呼叫,傳遞引用,高效能,支援傳遞非序列化對象。
  • @Remote:跨 JVM/網絡呼叫,傳遞序列化副本,需實現 Serializable。

總結:EJB 3.0 組件選型決策樹

  1. 需維護會話狀態? → @Stateful
  2. 無狀態、同步執行業務邏輯? → @Stateless
  3. 領域模型需持久化、查詢、關係映射? → @Entity (JPA)
  4. 異步處理訊息、解耦生產消費者? → @MessageDriven
  5. 定時排程任務? → @Schedule / TimerService (EJB 3.1+)

EJB 3.0 以「配置即代碼」重新定義了企業級 Java 開發體驗,配合 CDI、JPA、Bean Validation 形成現代 Java EE/Jakarta EE 技術棧的核心基石。

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