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>
ApplicationContext 啟動時會預先實例化所有單例 Bean。若 EJB 尚未綁定至 JNDI,代理工廠啟動期查找 Home 接口會拋出異常。《Spring in Action》建議設定 lazy-init="true" 延遲初始化至首次使用。
實際場景:init Servlet 載入引用 businessComponent 的 Bean,即使設定 lazy-init="true",Spring 容器仍在啟動階段初始化該代理,導致 JNDI 查找失敗。
查閱 Spring API 發現,SimpleRemoteStatelessSessionProxyFactoryBean 內部邏輯:lazy-init 僅控制 Bean 本身是否延遲實例化,但代理工廠的 afterPropertiesSet() 中仍會根據 lookupHomeOnStartup(預設 true)決定是否立即查找 Home。將 lookupHomeOnStartup 設為 false,可強制首次業務調用時才查找 Home 接口,完美解決啟動順序競態問題。
lookupHomeOnStartup="false"。LocalStatelessSessionProxyFactoryBean。