`
yimlin
  • 浏览: 136922 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

AOSD:应用AOP实现业务逻辑

阅读更多
(下面是发在javaeye上的帖子,因为觉的还有点意思,转到blog来,关于Domain和AOSD已经有了一些新的想法)

应用Domain开发的系统,通常把逻辑放在Domain Service层中,而Domain Service做两个工作:
1. 和表现层通信,表现为把表现层的平面数据(VO)转换为相关联的Domain对象,把Domain对象计算的结果转换成平面数据(VO)返回给表现层;
2.根据Use Case完成商业逻辑的调度。

以下主要讨论Use Case的内容。
通常Use Case所描述的Business Flow分为四种:Basic Flow,Alternate Flow,Exception Flow和Extension Flow。
虽然Business Flow可能包含很多领域对象,由于每个use case的目标带有浓厚的领域逻辑,因而可以通过分析提炼出一个主domain对象。然后重组转换来自BA或者PM的BP设计文档,使其中的Basic Flow基于主domain对象,而把 Alternate Flow,Exception Flow和 Extension Flow基于其它的Domain Service和Domain Object(当然包括Util objects), 最后利用AOP把Alternate Flow, Exception Flow和Extension Flow 与Basic Flow在Service层组织起来。
使用AOP来组织Use Case时,与使用AOP组织技术问题(比如日志,权限检查和事务处理等)不同。
在AOP组织技术问题时,我们不关心join point的目标对象和目标方法以及入口参数。比如:
 
public class BankServiceImpl implements BankService
public void transfer(UserAccount src, UserAccount dist, 
BigDecimal amount)
throws Exception
        src.subtract(amount); 
        dist.add(amount); 
}
 
//Other code goes here 
}
 


< bean id = "  BankService "   class = " org. 
springframework.transaction.interceptor.TransactionProxyFactoryBean "
     < property name = " transactionAttributes " >  
         
< props >  
< prop key = " transfer " > PROPAGATION_REQUIRED </ prop >                   
         
</ props >  
    
</ property >  
</ bean >  


我们不关心参数,或者在一些方法重载的地方利用参数来识别区分我们的方法入口。
但当我们利用AOP来组织Use Case时我们关心目标对象和目标方法以及入口参数因为AOP所要织入的方法是另一个Use Case是另一个Biz Flow。(这个在AOSD中显示讨论的不多,只有在12章12.4.中有提到)
比如我们要在转帐成功后发手机短信通知客户。那么在没有用AOP代码中我们这样写:

public class BankServiceImpl implements BankService
public void transfer(UserAccount src, UserAccount dist, 
BigDecimal change)
throws Exception
        src.subtract(change); 
        dist.add(change); 
        SMSService.sendSMS(src, change); 
        SMSService.sendSMS(dist, change); 
}
 
//Other code goes here 
}
 
Public 
class SMSService 
        
public static void sendSMS(UserAccount user, BigDecimal change)
             Long phone 
= user.getPhoneNumber(); 
             BigDecimal balance 
= user.getBalance(); 
             send(phone, change, belance) 
}
 
private static void send(Long phone, change, balance)
 
}
 
}
 


事实用User Case的观点分析,发送短信通知是另一个use case,是转帐这个use case的extend flow。用AOP的方法应该如下:

public class BankServiceEx 
public static void notify(UserAccount src, BigDecimal change) 
        SMSService.sendSMS(src, change); 
}
 
//Other code goes here 
}
 


public aspect BankServiceAspect 
pointcut transfer():call(
void BankService.transfer(..)); 
        
        after(UserAccount src, UserAccount dist, BigDecimal change) returning : transfer() 
&& args(src, dist, change)
        BankServiceEx.notify(src, change); 
BankServiceEx.notify(dist, change); 
        }
 
}
 


这样我们完成了两个用例的分离,两个用例独立,可以重用和测试。比如上述短信通知用例其实可以被重用到其它情况如:存款,消费,以及银行分红等等。
不过可能面临一个情况是,两个独立用例的代码部分都可能用到某个对象, 那么在两个用例中可能重复一部分代码。虽然从概念上看,不应该重复(在使用用旧的方法实现时不会重复),但从不同use case看,这个重复是值得的。曾经考虑利用代码生成,直接获得Local Variable,这样可以减少重复,但是这个想法是错误的,不仅仅是实现上的困难,更重要在于,分离出的发送短信用例便绑定了转帐用例,依赖于转帐用例,而无法独立重用和测试。
这样,对象、方法以及方法参数构成了一个完整的pointcut,成为不同用例切片的共同入口,相当于一个占位符。这个时候就需要不同的用例实现人员协调好该入口。
0
0
分享到:
评论

相关推荐

    用Java动态代理实现AOP

    目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至,也涌现出大量支持AOP的优秀Framework,--Spring, JAC, Jboss AOP 等等。AOP似乎一时之间成了潮流。Java初学者不禁要发出感慨,OOP还没有学通呢,又来AOP...

    java 实现AOP

    可以看到,采用AOP之后,日志记录和业务逻辑代码完全分开了,以后要改变日志记录的话只需要修改日志记录处理器就行了,而业务对象本身(BusinessObject)无需做任何修改。并且这个日志记录不会造成重复代码了,所有...

    基于AOSD的应用系统开发研究 (2008年)

    研究表明,运用面向方面的软件分析和设计方法(AOSD)开发可以很好的解决横切问题,模块的内聚性得到加强,同时使系统的并行开发得以实现,在面向方面编程(AOP)的基础上,结合ATM系统对AOSD进行了研究。

    08_AOSD.pdf

    08_AOSD.pdf 这些都是关于java设计模式的,要是想提高看看吧!不错的!

    BITEK BIT1618C AOSD/BOSD demo code for AT070TN94

    BITEK BIT1618C AOSD/BOSD demo code for AT070TN94. AOSD stands for Advanced OSD BOSD stands for Basic OSD.

    AOP在大规模软件开发项目应用的尝试与思考

    本文的写作源于一个真实的大型软件开发项目,我们努力尝试在这个项目中推广应用AOP。在此我们将对曾经面临过的一些实际问题与困难进行分析,试图引发关于面向方面软件开发(AOSD)的一些更深层次的思考。本文的作者将...

    Apect c++ 教程 + 实例 +论文 +期刊 AOP 打包下载

    有的研究实现,应用还比较少,只是为研究而做些实例试验。但从各种刊物和会议上的报 告交流来看,提出了许多问题,并对不少问题进行了深入的分析研究,有的已提出解决方 案,并取得了初步成果。 面向对象方法...

    BITEK BIT1618C AOSD (Advanced OSD) 培訓教材

    BITEK BIT1618C AOSD (Advanced OSD) 培訓教材.

    BITEK BIT1802 AOSD demo code

    BITEK BIT1802 AOSD (Advanced OSD) demo code.

    BITEK BIT1618C AOSD demo code

    BITEK BIT1618C AOSD demo code for AT070TN94 panel.

    BITEK BIT1802 AOSD demo code 含FLASH image

    BITEK BIT1802 AOSD demo code 含外部 FLASH image.

    BITEK BIT1802A demo board with AOSD schematic

    BITEK BIT1802A demo board with AOSD schematic. It supports external serial flash (25Fxx).

    C#开源资源大汇总

    PostSharp 使开发程序分析应用程序容易得像分析代码规则和设计模式,它使程序开发的思想变革为面向方面软件开发(AOSD/AOD)思想。 AspectDNG 的目标是为.NET 开发人员提供简单而功能强大的AOP-GAOP 实现。它效仿java...

    BITEK BIT1802A AOSD 功能測試範例源代碼

    BITEK BIT1802A AOSD 測試範例源代碼. 支持 TRUST T070SWV056H 7" (800 (H) x RGB x 480 (V)) 展示 Advanced OSD 功能.

    aosd-开源

    X工具,用于监视ALSA声音系统并使用XOSD在屏幕上显示音量变化。

    C#开源资源大汇总.rar

    Encase 是C#编写开发的为.NET平台提供的AOP框架。Encase 独特的提供了把方面(aspects)...PostSharp使开发程序分析应用程序容易得像分析代码规则和设计模式,它使程序开发的思想变革为面向方面软件开发(AOSD/AOD)思想。

    detect_deforestation:WS2021的AOSD最终项目

    WS20 / 21的AOSD最终项目 先决条件 NDVI时间序列必须存在于存储库文件夹中名为“ landsat_monthly”和“ landsat_3monthly”的文件夹中。所述目录位于.gitignore中,因此不将其全部上传到此处。 PRODES数据集的来源...

    Aspect.Oriented.Software.Development part 2 of 2 [CHM]

    Using AOSD to streamline complex systems development without sacrificing flexibility or scalability How AOSD builds on the object-oriented paradigmand how it's different State-of-the-art best ...

Global site tag (gtag.js) - Google Analytics