爱加速小课堂:代理模式之动态代理的优化
发布时间:
紧接上文,Oberg完成了这个优雅的EJB实现,也奠定了JBoss直到4.0版本之前没有改变的架构基础,这是全世界第一个基于动态代理机制的EJB实现!
完成了JBoss的核心实现之后,Oberg并没有停止思考。一方面,他深感EJB的繁复给开发者带来了巨大的不便,于是开发了一个名为“EJBDoclet”的工具。
另一方面,Oberg本人仍然坚信:代码生成(尤其是自动生成Java代码)是一种恶行——虽然或许是必要的恶行。于是他开始总结:有哪些事情是在不断重复做的?动态代理能不能对解决这些问题有所帮助?
对于第一个问题,他很快找到了不少的答案,例如:
日志:如果需要记录所有方法的调用时间、传入参数、返回值,就必须编写大量的重复代码。
安全性检查:如果需要给业务方法加上基于角色的访问控制,就必须逐个方法修改。
事务管理:如果需要访问事务性资源(例如关系型数据库),必须在每个操作之前开启事务、操作结束之后提文或回滚事务。
这些问题有一个共同的特点:它们都分布在各个对象继承体系中,任何业务对象都可能需要它们;另一方面,它们又与具体的业务逻辑几乎没有关系。也就是说,它们纯粹是基础设施(infrastructure)功能。
但这种设计方案有两个缺陷。其一,业务对象除了实现业务接口之外,还必须实现一个容器特有的接口(例如EJB容器规定的SessionBean接口)。甚至是继承容器特有的基类,这对业务对象造成了侵入,使它难以移植到别的应用环境中。
其二,由于基础设施都是通过回调接口提供,所以“可以提供哪些基础设施服务”实际上是预先规定好的,不能根据需要定制。
而这两个重大的缺陷正是导致EJB和Apache Avalon等经典容器最终无法满足需要而被淘汰的根本原因。
推荐阅读
更多>