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

Spring 延遲載入 EJB 代理:lazy-init 失效與 lookupHomeOnStartup 正解

     編輯:Java 相關知識

Spring 提供兩大 EJB 代理工廠 Bean:LocalStatelessSessionProxyFactoryBean(本地 EJB)與 SimpleRemoteStatelessSessionProxyFactoryBean(遠端 EJB)。配置範例:

<bean id="businessComponent" 
      class="org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean">
  <property name="jndiName"><value>ejb/location.business.comp</value></property>
  <property name="businessInterface"><value>com.test.LocationBusinessComponent</value></property>
  <property name="lookupHomeOnStartup"><value>false</value></property>
</bean>

問題背景:容器啟動時搶先查找 Home 接口導致失敗

ApplicationContext 啟動時會預先實例化所有單例 Bean。若 EJB 尚未綁定至 JNDI,代理工廠啟動期查找 Home 接口會拋出異常。《Spring in Action》建議設定 lazy-init="true" 延遲初始化至首次使用。

實測發現:lazy-init 並未生效

實際場景:init Servlet 載入引用 businessComponent 的 Bean,即使設定 lazy-init="true",Spring 容器仍在啟動階段初始化該代理,導致 JNDI 查找失敗。

根因與正確解法:lookupHomeOnStartup=false

查閱 Spring API 發現,SimpleRemoteStatelessSessionProxyFactoryBean 內部邏輯:lazy-init 僅控制 Bean 本身是否延遲實例化,但代理工廠的 afterPropertiesSet() 中仍會根據 lookupHomeOnStartup(預設 true)決定是否立即查找 Home。將 lookupHomeOnStartup 設為 false,可強制首次業務調用時才查找 Home 接口,完美解決啟動順序競態問題。

最佳實踐總結

  1. 遠端 EJB 代理務必設定 lookupHomeOnStartup="false"。
  2. 本地 EJB 同理適用 LocalStatelessSessionProxyFactoryBean。
  3. 若 EJB 部署於同一容器,優先考慮本地介面避免 RMI 開銷。
  4. 參考官方 JavaDoc:SimpleRemoteStatelessSessionProxyFactoryBean API
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved