EJB (Enterprise JavaBeans) 是 Java EE 平台上構建分佈式、事務性、安全的企業級業務邏輯組件的標準規範。它將系統級服務(事務、安全、持久化、並發等)從業務代碼中分離,由容器自動管理,讓開發者專注於領域邏輯。
規範定義了六個角色,各司其職,通過標準接口協作:
| 角色 | 職責 | 產出物 |
|---|---|---|
| 企業 Bean 開發者 | 編寫業務邏輯、定義接口、提供部署描述符 | EJB 類、Home/Remote 接口、ejb-jar.xml |
| 應用組裝者 | 組合多個 EJB 為完整應用,可能編寫 Web 層 (JSP/Servlet) | 應用程序 EAR 包 |
| 部署者 | 將 ejb-jar 部署到特定環境,配置資源 (JDBC、JMS)、生成存根/骨架 | 已配置的 EJB 容器部署單元 |
| EJB 服務器提供者 | 提供底層分佈式事務、對象管理等系統服務 (通常由中間件廠商兼任容器提供者) | EJB Server 產品 |
| EJB 容器提供者 | 實現容器運行時:生命周期管理、事務/安全攔截、部署工具、監控工具 | EJB Container 產品 |
| 系統管理員 | 維護服務器/容器運行環境,監控組件狀態 | 穩定的生產環境 |
異步消息處理,實現鬆耦合集成 (JMS)。
SessionBean 或 EntityBean 接口,包含 ejbCreate、業務方法、回調方法 (ejbActivate/ejbPassivate 等)。Serializable,對應數據庫主鍵。ejb-jar.xml):聲明 Bean 類型、事務屬性、安全角色、資源引用等。package ejb.hello;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface Hello extends EJBObject {
String getHello() throws RemoteException;
}
package ejb.hello;
import javax.ejb.*;
import java.rmi.RemoteException;
public interface HelloHome extends EJBHome {
Hello create() throws CreateException, RemoteException;
}
package ejb.hello;
import javax.ejb.*;
import java.rmi.RemoteException;
public class HelloBean implements SessionBean {
private SessionContext ctx;
public void ejbCreate() {}
public String getHello() throws RemoteException { return "Hello World"; }
// 容器回調方法...
public void setSessionContext(SessionContext ctx) { this.ctx = ctx; }
public void ejbActivate() {} public void ejbPassivate() {} public void ejbRemove() {}
}
<?xml version="1.0"?>
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>Hello</ejb-name>
<home>ejb.hello.HelloHome</home>
<remote>ejb.hello.Hello</remote>
<ejb-class>ejb.hello.HelloBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method><ejb-name>Hello</ejb-name><method-name>*</method-name></method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
Context ctx = new InitialContext(env);
HelloHome home = (HelloHome) ctx.lookup("HelloHome");
Hello hello = home.create();
System.out.println(hello.getHello()); // 輸出: Hello World
現代 EJB (3.0+) 採用註解配置 (@Stateless, @PersistenceContext 等),摒棄 Home/Remote 接口與 XML 描述符,引入 JPA 替代 Entity Bean,大幅簡化開發。但理解經典架構有助於掌握容器服務本質。