7、EJB
(1)Spring和EJB
l Spring是轻量级容器,在许多场合可以用来替代EJB
l Spring使得访问和实现EJB更容易
(2)EJB访问
l 使用EJB通常有:
Ø 服务定位器:关心JNDI、初始化context、EJB Home查找
Ø 业务代表:减少耦合,隐藏实现细节
l 使用Spring不需要这些设计模式
(3)访问本地SLSB
l 使用本地无状态Session Bean
<bean id="myComponent"
class="...ejb.access.LocalStatelessSessionProxyFactoryBean">
<property name="jndiName">
<value>myComponent</value>
</property>
<property name="businessInterface">
<value>com.mycom.MyComponent</value>
</property>
</bean>
创建使用服务定位器访问EJB的代理(业务代表)
l 你可以交换Bean的实现,而不需要改变客户代码:客户程序使用业务接口,而不是EJB的特定接口
(4)访问远程SLSB
l 使用远程无状态Session Bean
<bean id="myComponent"
class="...SimpleRemoteStatelessSessionProxyFactoryBean">
<property name="jndiEnvironment">
<ref bean="myEnvironment"/>
</property>
<property name="jndiName">
<value>myComponent</value>
</property>
<property name="businessInterface">
<value>com.mycom.MyComponent</value>
</property>
</bean>
(5)EJB实现
l AbstractEnterpriseBean
Ø 加载BeanFactory:EJB环境变量ejb/BeanFactoryPath指定XML BeanFactory文件在classpath中的位置;缺省的BeanFactory是XmlApplicationContext
l 应用程序只是使用EJB作为前端
Ø 业务逻辑推迟到了BeanFactory的Bean中
(6)实现SLSB
l 无状态Session Bean
l 扩展AbstractStatelessSessionBean
Ø 保存Session context
Ø 空实现ejbRemove
Ø ejbCreate()方法
Ø 在ejbActivate()和ejbPassivate()中抛异常
l 子类必须实现onEjbCreate()
l 例子:
class MySlsb extends AbstractStatelessSessionBean {
protected void onEjbCreate() throws CreateException {
...
}
public void businessMethod() {
BeanFactory bf = getBeanFactory();
MyBusinessBean mbb = bf.getBean("myBusinessBean");
...
}
}
(7)实现SFSB
l 保持状态Session Bean
l 扩展AbstractStatefulSessionBean
Ø 保存Session context
Ø 空实现ejbRemove
Ø ejbCreate()方法
l 子类必须实现ejbCreate()、ejbActivate()和ejbPassivate()
l 例子:
class MySfsb extends AbstractStatefulSessionBean {
public void ejbCreate() throws CreateException {
loadBeanFactory();
...
}
public void ejbActivate() {
...
}
public void ejbPassivate() {
...
}
public void businessMethod() {
BeanFactory bf = getBeanFactory();
MyBusinessBean mbb = bf.getBean("myBusinessBean");
...
}
}
(8)实现MDB
l 例子:
class MyMdb extends AbstractJmsMessageDrivenBean {
protected void onEjbCreate() throws CreateException {
...
}
public void onMessage(Message message) {
BeanFactory bf = getBeanFactory();
MyBusinessBean mbb = bf.getBean("myBusinessBean");
...
}
}