Spring框架最初是作为对EJB应用的替代出现的,但是EJB3的改进使得EJB得到了重生。那么,Spring框架与EJB能否联合使用呢,答案是肯定的。
下面,我们将详细说明在Spring应用中如何访问EJB服务。
通常,访问EJB服务就是调用EJB对象的方法。这首先要进行JNDI查找获取EJB对象的接口,然后调用create()创建EJB对象,最后调用EJB对象的方法。
为了避免上述过程的代码重复,EJB应用往往使用Service Locator设计模式和Business Delegate设计模式。
Spring框架中,对无状态会话EJB的访问进行了优化,通过Spring框架提供的EJB代理对象,可以避免EJB调用模式的不足,简化对EJB的调用。
假设EJB组件都实现了com.mycom.MyComponent接口。
1.访问本地无状态会话EJB
<bean id="myComponent" class="org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean"> <property name="jndiName" value="ejb/myBean"/> <property name="businessInterface" value="com.mycom.MyComponent"/> </bean> <bean id="myController" class="com.mycom.myController"> <property name="myComponent" ref="myComponent"/> </bean>说明:LocalStatelessSessionProxyFactoryBean代理了EJB对象,被代理的EJB对象实现了com.mycom.MyComponent接口。
com.mycom.myController类作为EJB客户端引用了EJB组件。
为了实现XML配置对代理对象的透明性,与上述定义等价的配置如下:
<jee:local-slsb id="myComponent" jndi-name="ejb/myBean" business-interface="com.mycom.MyComponent"/> <bean id="myController" class="com.mycom.myController"> <property name="myComponent" ref="myComponent"/> </bean>注意<jee:local-slsb>的用法。
2.访问远程无状态会话EJB
<bean id="myComponent" class="org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean"> <property name="jndiName" value="ejb/myBean"/> <property name="businessInterface" value="com.mycom.MyComponent"/> </bean> <bean id="myController" class="com.mycom.myController"> <property name="myComponent" ref="myComponent"/> </bean>
<jee:remote-slsb id="myComponent" jndi-name="ejb/myBean" business-interface="com.mycom.MyComponent"/> <bean id="myController" class="com.mycom.myController"> <property name="myComponent" ref="myComponent"/> </bean>
前述方法适用于所有EJB组件,对EJB3的无状态会话EJB的访问,还可以使用通用的JNDI代理对象。
org.springframework.jndi.JndiObjectFactoryBean
<jee:jndi-lookup>