在 J2EE 企業級應用開發中,EJB(Enterprise JavaBeans)作為業務邏輯層的核心組件,其設計質量直接決定系統的性能、可維護性與擴展性。本文結合實戰經驗,深入剖析兩大經典設計模式——Session Facade(會話外觀)與Value Object(值對象)在 EJB 開發中的應用原理、實現策略及代碼實踐,助力開發者構建高效、低耦合的分布式系統。
相較於傳統二層架構,J2EE 採用多層分布式模型,將應用邏輯封裝於不同組件:

EJB 組件架構是 J2EE 的基石,提供事務管理、安全性、持久化等容器級服務,使開發者專注於業務邏輯。然而,隨著系統複雜度提升,直接暴露實體 Bean 給客戶端會引發性能瓶頸與耦合難題,此時設計模式的引入勢在必行。
實體 Bean 採用 CMP(容器管理持久化)時,客戶端需多次調用 getXxx() 方法獲取屬性值,每次調用均涉及網絡往返,導致性能急劇下降。如圖所示:

Value Object 是可序列化的 Java 對象,一次網絡傳輸即可封裝大量數據,客戶端本地緩存後可反複讀取,避免重複查詢數據庫。
setValueObject() 批量更新getXxxValueObject()/setXxxValueObject() 方法引入 Session Bean 作為外觀層,封裝實體 Bean 交互細節,提供粗粒度業務方法:
public interface Account extends javax.ejb.EJBObject {
AccountValue getAccountValueObject();
void setAccountValueObject(AccountValue v);
// 其他業務方法...
}
// 實體 Bean 內部實現
private AccountValue createAccountValueObject() {
AccountValue vo = new AccountValue();
vo.accountNumber = accountNumber;
vo.balance = balance;
return vo;
}
public AccountValue getAccountValueObject() {
return createAccountValueObject();
}
public void setAccountValueObject(AccountValue v) {
this.accountNumber = v.accountNumber;
this.balance = v.balance;
}
public class AccountValue implements java.io.Serializable {
private String accountNumber;
private double balance;
public void setBalance(double newValue) { this.balance = newValue; }
// getter/setter 方法...
}
public class AccountFactory {
public Vector getAccounts(String userid) throws FactoryException {
Vector vect = new Vector();
AccountHome home = getAccountHome();
Enumeration refs = home.findByUserid(userid);
while (refs.hasMoreElements()) {
Account acc = (Account) refs.nextElement();
vect.addElement(acc.getAccountValueObject());
}
return vect;
}
}
public class AccountSessionBean implements SessionBean {
public Vector getAccounts(String userid) throws FactoryException {
AccountFactory fact = new AccountFactory();
return fact.getAccounts(userid); // 委派給 Factory
}
// 其他業務流程方法...
}
結合 Value Object 減少網絡往返、Session Facade 實現服務封裝與解耦,可顯著提升系統:
此外,輔以 Service Locator(服務定位器) 等輔助模式,可進一步優化 JNDI 查找開銷。掌握這些核心模式,是構建高質量 J2EE 系統的必修課。