AOP,面向切面编程
举一个最简单的例子说明什么是面向切面编程,银行柜员机程序,它实现的商业逻辑很简单,如果客户取钱就在客户的帐户上做减法,如果存钱就做加法。这样的开发任务交给程序员他最开心,因为这对他来说小菜一碟。
而实际上银行和客户对只实现这2 个 功能的程序是不放心的,于是就引进了事务处理保证操作的完整性、日志功能完成报表稽核,这时程序员就要郁闷了:要分析每一个商业逻辑,在代码开始的部分声 明事务开始、代码结束的部分声明事务结束,还要捕获中间发生的异常,进行异常处理;对于涉及到资金变化的逻辑结束的时候要写日志,这个相对简单,但是成百 上千的ctrl+c/ctrl+v 对程序员来说是也是不能忍受的。
从上面的例子可以看到,我们真正需要的可能就那么一两条代码,而实际上我们已经写了一二十行。AOP 就是来解决这种问题的。让程序员只关注核心代码,切面代码(上面的事务处理、日志记录就是切面,后面还会讲到)进行模块化。实际使用大概是这样的:对于事务处理,程序运行到核心代码处,拦截器(AOP 框架提供的)激活,触发事务处理切面代码声明事务开始,核心代码结束,拦截器再次激活,触发事务处理切面代码事务提交。
这 样我们可以让高级程序员先编写事务处理切面模块,测试通过后就可以给初级程序员用了;初级程序员们负责编写各种各样的商业核心逻辑代码,测试通过后提交给 配置程序员,配置程序员将商业代码和切面模块进行组合配置,最后进行合并测试,测试通过,结束。按这种方式开发,方便测试、程序模块之间低耦合、非侵入 式,是不是老板开心、程序员也开心呢?
刚开始看AOP 的时候总是被它的那些概念搞得一头雾水,这里是我的一些理解:
- Concern( 要素) :程序关注的一个区域。比如,有适合AOP 的像事务处理和不适合的像产品组合分类(适合OOP )。
- Crosscutting Concern( 横切要素) :Concern 的一种,其实就是适合AOP 的Concern ,横切我理解是和OOP 相对的意思,OOP 一般都是继承树,而横切就将有相同需要的类放到了一个平面进行处理。好像父类生物,下面继承有大白菜、猪,我们横切这2 个类,放到我们的食品工厂要进行食品罐装加工(第一步清洗杀菌... 最后一步打印生产日期)这样就分别生产出了韩国泡菜和午餐肉
- Aspect( 切面) ,Crosscutting Concern 的模块化,将抽象的东西Crosscutting Concern 具体了一下。如事务处理、食品罐装加工。
- Join Point( 连接点) :程序或类执行过程中的一个点。一般是核心商务逻辑的某一个方法,好像银行柜员机程序的资金入库方法saveMoney() 。
- Advice( 通知) :在Join Point 上执行的一个动作,通知一般通过拦截器调用。有这几种类型的Advice ,around( 包围型) 、before 、after 。事务处理就是around 型,日志记录是after 型。
- Pointcut( 切入点) :这个东东很有用,它是一系列的Join Point ,用通配符或者正则表达式表示,比如save* 表示所有以save 开头的方法,Pointcut 和Advice 绑定,这样Advice 就可以通知满足条件的一类Join Point 。比如所有事务处理切面around 以save 开头和update 开头的方法,而select 开头的方法不受影响。
- Introduction( 引入) :不是很理解,以后补充吧。
- Target Object( 目标对象) :包含Join Point 的对象,也就是被就Advice 的类,也就是是商务逻辑对象,比如银行柜员机类。这个对象永远是一个被代理的对象。
- AOP Proxy(AOP 代理) :由AOP 框架创建的对象,实现advice 的执行。
- Weaving( 织入) :将Aspec 模块织入核心商务逻辑,比如,将事务处理模块和银行柜员机程序通过配置结合起来,决定什么情况下事务处理模块被通知调用。
C++扩展AOP可以参考AspectC++