AspectJ: 通往AOSD之路的最佳军火

原创 2006年06月24日 01:06:00

同步自:http://www.blogjava.net/AndersLin/archive/2006/06/24/54806.html

AOSD:应用AOP实现业务逻辑中, 我提出关注的接口;
其原文在javaeye上的讨论狼平方也提出可以用event,或者intercepter。
当然不同的方式可以解决不同的问题。这里要讨论一下AspectJ和Event以及intercepter的不同。

1. 先来看看event的方式:需要两个对象Event和EventHandler(EventListener),event和eventHandler,属于数据契约。换句话说,牺牲了编译检查的好处,当然可以应对变化时有一定的好处。一旦需求变化,代码上的变动需要的工作量不少,更为严重的是,如狼平方所说的侵入性太强。
2  接着看interceptor的AOP,相对于Event方式,虽然都是基于数据契约,都给自己做转型,但是代码量少了(因为代码生成),重要的是没有event那样的侵入性。
3. 狼平方做了改进,利用AOP来做brocastEvent的工作。需要做的工作还是很多,甚至我以为这个工作还不如直接用Interceptor来得直接。

如我在小议领域模型(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中我们希望做些额外的工作,
以狼平方的例子,比如:financialService.createRequestOfMoney(...);
那么无论是用event:

public  SomeObject doSomeAction() {
 
 brocastEvent(
new  Event());
}

还是interceptor:

public   class  SomeInterceptor  implements  MethodInterceptor   {
    
public  Object invoke(MethodInvocation invoke)  {
          obj 
=  invoke.proceed(); //  执行被拦截的方法完成业务操作       
       
 .
         financialService.createRequestOfMoney(.);
    }

}

我们注意到,这样做的结果是在bizProcessA()和bizProcessB()的不同业务流程都将导致执行
financialService.createRequestOfMoney
不过我们的流程逻辑要求是:
在bizProcessA()的流程下,执行financialService.createRequestOfMoney
而在bizProcessB的流程下,不执行financialService.createRequestOfMoney。

很明显无论是之上event,还是interceptor的AOP都无法解决这个问题。

面对这样的需求,就需要改进或者重构:
1. 最简单也最直接改doSomeAction(...)为doSomeAction(...boolean flag)。很明显这样的做法很不理想
2. 来点OO的, 将doSomeAction(...)分出去,作为一个接口,采用多态解决。不过依然需要解决动态加载问题,处理起来又需要费点手段。

真的只有这两个手段了吗?不!还有,那就是AspectJ
AspectJ提供了如下
within
withincode
withincode
cflow
cflowbelow

几个内置的pointcut,将可以做到我们要的效果,代码如下:

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的最佳也是唯一军火。
事实上很多时候,解决问题的方法有很多,本文旨在阐明AOSD为我们提供了另一条思路。欢迎讨论和拍砖!

另补上我在javaeye讨论贴的完整例子代码,下载

《通往财富自由之路》学习笔记

最近在《得到》APP订阅了李笑来老师的《通往财富自由之路》专栏,特此将学习到内容在此总结和督促自己践行。什么是财富自由?首先,对财富自由的理解。我们通常理解财富自由即一个人的被动收入大于等于日常开销,...
  • anda0109
  • anda0109
  • 2016年08月09日 23:06
  • 5772

《Python 机器学习及实践--从零开始通往kaggle竞赛之路》--第一章代码

logistic regression 实现二分类
  • wanglei5205
  • wanglei5205
  • 2018年01月03日 15:09
  • 123

《通往财富自由之路》阅读笔记(一)

最近付费订阅了由罗辑思维推荐的李笑来前辈的在得到App里面的专栏《通往财富自由之路》,看了几篇感觉还是有收获的,笔记下这两天看到的文章的一些概念或者结论。 (1)什么是财富自由 李笑来前辈...
  • u010454030
  • u010454030
  • 2016年09月28日 22:35
  • 990

bzoj 1484 [HNOI2009]通往城堡之路 贪心

感觉这题还是挺迷的。。。 并不会证这个玩意为什么是对的。。。固定第一个点的值,其他点的值取a[i]-(i-1)*d(这个点能取的最小值) 然后每次找一个后缀,把这个后缀所有数加一个大于0的值,且保...
  • make_it_for_good
  • make_it_for_good
  • 2016年11月28日 20:34
  • 271

《python机器学习及实践-从零开始通往kaggle竞赛之路(代码Python 3.6 版)》chapter1.1

本博客代码是对书《python机器学习及实践-从零开始通往kaggle竞赛之路》,基于Python3.6的实现,并且使用的所需的库更新时间为(2017/12/8)。 chapter1_1 impo...
  • weixin_37978606
  • weixin_37978606
  • 2017年12月08日 16:56
  • 150

读书笔记 - Python机器学习及实践 —— 从零开始通往Kaggle竞赛之路

第1章 简介篇 1.1机器学习综述 机器学习系统具备如下特点: >许多机器学习系统所解决的都是无法直接使用固定规则或者流程代码完成的问题,通常这类问题对人类而言却很简单。比如,计算机和手机中的计...
  • Islotus
  • Islotus
  • 2017年04月18日 10:49
  • 1941

hnoi 2009 通往城堡之路

这道题并不是我想出来的。。是看了网上一个程序然后自己yy出这个程序是干什么的。。先放原地址:http://yuyuyusachs.blogbus.com/logs/61039360.html这里再放我...
  • ts124124
  • ts124124
  • 2011年03月14日 22:37
  • 1833

油田信息化:通往智慧之路(1.2-智慧城市在全球的发展)

二、智慧城市在全球的发展 2009年底,IBM公司公布了“智慧的城市”的概念及其软件解决方案。“智慧的城市”是IBM“智慧地球”策略中的一个重要方面。 “智慧地球”提出以更智慧的方法,通过新一代信...
  • lindaoshou
  • lindaoshou
  • 2017年02月11日 18:46
  • 810

bzoj1484: [HNOI2009]通往城堡之路

传送门 这题太迷的。。。 并不会证这个玩意为什么是对的。。。 固定第一个点的值,其他点的值取a[i]-(i-1)*d(这个点能取的最小值) 然后每次找一个后缀,把这个后缀所有数加一个大于0...
  • zhouyuyang233
  • zhouyuyang233
  • 2017年05月01日 15:40
  • 220

《Python 机器学习及实践--从零开始通往kaggle竞赛之路》笔记

《Python 机器学习及实践–从零开始通往kaggle竞赛之路》很基础 主要介绍了Scikit-learn,顺带介绍了pandas、numpy、matplotlib、scipy。 本书代码基于p...
  • longji
  • longji
  • 2017年04月17日 20:54
  • 4748
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AspectJ: 通往AOSD之路的最佳军火
举报原因:
原因补充:

(最多只允许输入30个字)