EJB
一个最大的缺点就是要想脱离
EJB
容器而单独测试
EJB
组件非常困难。通过
Spring
可以解决这个问题,将业务逻辑写在
POJO
中,然后,通过
EJB
委托给
POJO
来执行操作。在
Spring
中,由于不必将如何定位和创建
POJO
的实现的任何逻辑嵌入到
EJB
中,这种实现就是非常简单,和灵活的。下面是一个继承于
AbstractStatelessSessionBean
的无状态会话
Bean
的基类,系统中的每个
SLSB
都继承于此类。所有的请求都通过这个
SLSB
来转发给
POJO
。因为每次初始化的内容都不一样,所以将初始化放到了
SLSB
的每个继承类中。
<o:p></o:p>
<o:p> </o:p>
public abstract class SessionFacade extends AbstractStatelessSessionBean {<o:p></o:p>
/**
<o:p></o:p>
*
如果子类需要进行全局的初始化工作,那么应该
Override
这个方法。
<o:p></o:p>
*/
<o:p></o:p>
public
abstract
void
init();<o:p></o:p>
protected
void
onEjbCreate()
throws
CreateException {
<o:p></o:p>
synchronized
(
initLock
) {
<o:p></o:p>
if
(
globalInit
)
<o:p></o:p>
return
;
<o:p></o:p>
else
{
<o:p></o:p>
init();
<o:p></o:p>
globalInit
=
true
;<o:p></o:p>
……
<o:p></o:p>
|
SLSB
的基类
<o:p></o:p>
<o:p> </o:p>
public
class
JCFServerFacadeBean
extends
SessionFacade
<o:p></o:p>
{
<o:p></o:p>
public
void
init()
<o:p></o:p>
{
<o:p></o:p>
ContextServiceLocator.getInstance().setContext(getBeanFactory());
<o:p></o:p>
boolean
bret = ServiceLocator.getInstance().init(
"etc/jcf/framework/config/ServiceConfig.xml"
);
<o:p></o:p>
}
<o:p></o:p>
}
<o:p></o:p>
|
SLSB
的继承类
<o:p></o:p>
<o:p> </o:p>
如上面的代码所示,由于在
SLSB
的初始化方法
setSessionContext
中实例化
Spring
的
ApplicationContext
,
Spring
的配置文件在类路径中的
beanRefContext.xml
文件标识,所以在
SLSB
的继承类中,调用
getBeanFactory
方法可以得到
Spring
的
ApplicationContext
,并赋予给
ContextServiceLocator
,方便以后的调用。
<o:p></o:p>
无状态会话
bean
是用
Spring
最容易构建的
EJB
;这是因为无论在何种情况下,它都不需要特殊的处理,并且类
AbstractStatelessSessionBean
实现了所有
ejbXXX()
方法。
<o:p></o:p>
因为真正的业务逻辑是写在
POJO
中的,
SLSB
的作用相当于
SessionFacade
模式中的
Façade
,在
Delegate
模式中的
Delegate
的请求都是通过
Façade
传到了后面的
Processor
,所以在系统中只需要一个或者是少量的几个
SLSB
就可以满足需求。甚至可以绕过
SLSB
通过
POJODelegate
访问后面的
Processor
,这给平时的开发带来的极大的灵活性。
<o:p></o:p>
对于异步的消息驱动
Bean
(
MDB
),
Spring
同样作出了支持。类似
SLSB
,
MDB
只要继承
AbstractMessageDrivenBean
,并实现
MessageListener
接口即可。同样在
setMessageDrivenContext
方法中初始化
Spring
的
ApplicationContext
,所有从
Delegate
的请求都通过
execute
方法传给
Processor
。在
MDB
继承类中的
OnMessage
方法就可以访问到
Spring
的
ApplicationContext
了。在此就不再罗嗦了。
<o:p></o:p>