在J2EE系统中,一般划分为表现层和业务逻辑层,为实现表现层和业务逻辑层之间的最大限度解耦,引入业务代理模式,这样,当表现层或业务逻辑层具体实现技术发生时,对彼此的影响很小
作者:中国IT实验室 来源:中国IT实验室 2007年8月26日
关键字:
EJB直接调用实现
我们知道,EJB是业务逻辑层实现的J2EE标准技术,EJB的session bean可以作为Service实现,例如上面在update中调用EJB的代码如下:
public ActionForward update(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
EgForm egForm = (EgForm) form;
Contact contact = new Contact();
BeanUtils.copyProperties(contact, egForm);
try{
InitialContext ic = new InitialContext();
UserServiceLocalHome ul = ic.lookup("UserService");
UserServiceLocal userService = ul.create();
userService.update(contact);
}catch(){
}
return mapping.findForward(SUCCESS);
}
在客户端表现层是直接调用EJB服务的,这种直接调用的方式类似Command模式,但是有两个缺点:
1. 客户端调用业务层实现代码较多,如上述红字行数有4行,客户端代码不简洁。
2.无法非常自由地为所有Service动态增加新的Filter之类新功能,当然除了EJB提供的事务机制、分布集群、安全ACL等除外,如果你要增加这些新功能,可以通过ejb-jar.xml配置增加。
业务代理模式实现目标
总结上述两种实现的优缺点,衡量一个业务代理模式是否良好有下面几个指标:
1. 业务层所有服务完全展示给客户端。客户端可以完全介入调用。
2. 动态扩展性强,可为整个业务逻辑层动态扩展新的功能。
3. 客户端调用业务层的实现代码必须简洁,至少是可配置的,最大限度降低代码的耦合性。
Ioc模式/AOP实现
目前,使用Ioc模式/AOP实现业务代理能够很好地达到上述3个目标,以JdonFramework为例:
1. 业务层所有服务完全展示给客户端。客户端可以完全介入调用。而且调用代码简洁,如下:
public ActionForward update(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
EgForm egForm = (EgForm) form;
Contact contact = new Contact();
BeanUtils.copyProperties(contact, egForm);
UserService userService = WebAppUtil.getService("UserService", rerquest);
userService.update(contact);
return mapping.findForward(SUCCESS);
}
上述红字两行代码不但适合调用普通POJO,而且适合调用EJB,具体是什么可以通过jdonframework.xml实现。
1. 通过加入自己的AOP拦截器可以为整个业务逻辑层动态扩展新的功能,这部分功能实现不是通过配置实现的,而是使用代码实现:
MethodInterceptor myI = new MyInterceptor();
WebAppUtil.addInterceptor(myI, request);
有关AOP中更复杂的pointcut实现,可以通过获得Ioc容器后自己实现:
ContainerWrapper cw = WebAppUtil.getContainer(request);
这样,可以为用户提供非常自由的面向微容器编程的基础,这比同样的Ioc/AOP实现Spring开源框架提供的自由度更广,更加透明。
更加重要的是,JdonFramework只是真正绅士地完成业务代理模式,不过多地介入业务层:业务层相关配置是使用配置文件实现;需要插入的通用功能是使用代码实现;而Spring目前版本则是将两者混淆在一起。