AspectJ: 通往AOSD之路的最佳军火 - 中国WEB开发者网络 (http://www.webasp.net) -- 技术教程 (http://www.webasp.net/article/) --- AspectJ: 通往AOSD之路的最佳军火 (http://www.webasp.net/article/29/28102.htm) |
| -- 作者:未知 -- 发布日期: 2007-01-15 |
在AOSD:应用AOP实现业务逻辑中, 我提出关注的接口; 1. 先来看看event的方式:需要两个对象Event和EventHandler(EventListener),event和eventHandler,属于数据契约。换句话说,牺牲了编译检查的好处,当然可以应对变化时有一定的好处。一旦需求变化,代码上的变动需要的工作量不少,更为严重的是,如狼平方所说的侵入性太强。 如我在小议领域模型(Domain Model) 所说的Domain Service处理两个逻辑:业务规则和流程逻辑,而AOSD:应用AOP实现业务逻辑要试图解决的问题是流程上逻辑,而以上无论是那种方式,都无法解决一个问题:流程信息。 public class DomainService {![]() public void bizProcessA() { ![]() SomeObject instance = doSomeAction( ); ![]() } public void bizProcessB() { ![]() SomeObject instance = doSomeAction( ); ![]() } public SomeObject doSomeAction( ) { ![]() } } 这里我们关注的目标方法是doSomeAction(),在doSomeAction中我们希望做些额外的工作, public SomeObject doSomeAction( ) { ![]() brocastEvent( new Event( )); } 还是interceptor: public class SomeInterceptor implements MethodInterceptor {![]() public Object invoke(MethodInvocation invoke) { obj = invoke.proceed(); // 执行被拦截的方法完成业务操作 . financialService.createRequestOfMoney( .); } } 我们注意到,这样做的结果是在bizProcessA()和bizProcessB()的不同业务流程都将导致执行 很明显无论是之上event,还是interceptor的AOP都无法解决这个问题。 面对这样的需求,就需要改进或者重构: 真的只有这两个手段了吗?不!还有,那就是AspectJ public aspect ServiceAspect { pointcut bp(): cflow(call( void DomainService.bizProcessA(..))); pointcut action(): call(doSomeAction( ));![]() ![]() SomeObject around( ) : bp() && action() && args( ) { SomeObject instance = proceed( ); financialService.createRequestOfMoney( .); return instance; } } 很显然,AspectJ提供了AOSD所需要的军火。 BTW:本文不针对狼平方同学,只是借由其两篇blog讨论开来,解释了AspectJ优点,以及为什么AspectJ是实现AOSD的最佳也是唯一军火。 另补上我在javaeye讨论贴的完整例子代码,下载。 |
| webasp.net |