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

Spring訪問與實現EJB組件完整指南:本地/遠程無狀態Session Bean

     編輯:Java 程式設計入門

Spring不僅是EJB替代品,更提供無縫EJB集成能力。通過代理模式簡化JNDI查找、Home創建、業務委托樣板代碼,實現本地/遠程EJB與POJO透明切換。

核心痛點

  • 傳統調用:JNDI查找 → Home.create() → 業務調用,樣板代碼多
  • Service Locator/Business Delegate模式雖封裝但難測試、仍耦合EJB API

Spring解決方案:代理工廠Bean

1. 訪問本地SLSB

業務接口(非EJB專用):

public interface MyComponent { void doBusiness(); }

EJB實現:

public class MyComponentEJB implements SessionBean, MyComponent {
    public void doBusiness() { ... }
    // ejbCreate/setSessionContext等生命周期方法
}

Spring配置:

<bean id="myComponent" class="org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean">
    <property name="jndiName" value="ejb/MyComponent" />
    <property name="businessInterface" value="com.mycom.MyComponent" />
</bean>

<bean id="myController" class="com.mycom.MyController">
    <property name="myComponent" ref="myComponent" />
</bean>

控制器僅依賴MyComponent接口,完全解耦EJB。

2. 訪問遠程SLSB

使用SimpleRemoteStatelessSessionProxyFactoryBean,額外優勢:

  • 業務接口無需拋出RemoteException
  • 代理捕獲RemoteException轉為未檢查異常RemoteAccessException
  • 客戶端代碼無感知切換本地/遠程/POJO實現

3. JNDI查找時機控制

默認啟動時查找並緩存Home。若EJB容器啟動較晚,設置lazy-init="true"延遲到首次使用:

<bean id="myComponent" class="..." lazy-init="true"> ... </bean>

Spring輔助類實現EJB

提倡「業務邏輯放POJO,EJB只負責事務/遠程」:

無狀態Session Bean

public class MyComponentEJB extends AbstractStatelessSessionBean implements MyComponent {
    private MyComponent pojo;
    
    protected void onEjbCreate() throws CreateException {
        pojo = (MyComponent) getBeanFactory().getBean("myComponentPojo");
    }
    
    public void doBusiness() { pojo.doBusiness(); }
}

BeanFactory定位策略

  • 默認ContextJndiBeanFactoryLocator:從java:comp/env/ejb/BeanFactoryPath加載
  • 多EJB共享上下文:重寫setSessionContext使用ContextSingletonBeanFactoryLocator

有狀態Session Bean鈍化/激活

public void ejbPassivate() { unloadBeanFactory(); }
public void ejbActivate() { loadBeanFactory(); }

因ApplicationContext不可序列化,需手動卸載/重載。

最佳實踐總結

  1. 優先用POJO+Spring事務,無分布式事務/遠程調用時無需EJB
  2. 需EJB時,用LocalStatelessSessionProxyFactoryBean隔離客戶端
  3. EJB實現類繼承Spring抽象基類,委托POJO處理業務
  4. 共享BeanFactory減少內存佔用與初始化開銷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved