Aop概念详解

    前面的一篇博客大概的讲了讲AOP的个人理解,也罗列了一些主要概念的定义。后面参加了一次AOP的讨论,发现对于概念的理解居然有这么多的分歧。所以,这篇博客要详细的解释一下我对这些概念的认知。

AOP的目的

    我们说AOP是OOP的一个补充,是为了程序更面向对象。这句话怎么说的呢?面向对象通过继承实现代码的复用问题。继承是类之间的一种静态的关系,是一种强耦合的关系。它通过抽取公共部分作为父类,将原来很多的类转化成了一棵继承树的关系。这样程序就是继承树和继承树之间构成的一种结构。如图:
    这种程序结构使得原来的重复的代码,转变成了一种纵向的、强耦合的继承关系树。这里问题来了,这时候发现各个继承树之间的子类还有公共的代码可以抽取。这时候你已经无法用继承来解决了,因为Java不支持多重继承。那么这时候就引入了AOP来解决这个问题。也就是说,AOP无视了类之间的继承关系,重新将所有的类都视为平等的关系。然后,再将公共部分抽取出来,并在运行时组合到需要的类中执行。那么引入了AOP之后的程序结构如下图:
     


    这种程序结构,增加了横跨各个类的、不分父子的公共代码的抽取。或者说是将类之间的公共部分代码转换为了类和类之间的一种组合关系。就是,图上红色箭头表达的意思。下面以日志为例,解释一下涉及到的几个主要概念。

场景

    如上图所示,五个子类属于两个继承树。但是他们都涉及到操作日志的功能。也就是日志这个功能的代码是跨越继承树的一种重复,这时候这五个子类的关系的平等的。同时,日志这个功能是独立于类的业务逻辑之外的。如果,你在代码里发现了具有这样的特点的代码,也就是你在代码里发现了切面。OK下面就开始说概念的理解了。

Advice

    你发现了切面,这时候,你就可以将日志的功能抽象为一个类。这个类就是Advice(增强)。而5个子类了,就只留下了业务代码。那么,实际使用时你抽象的Advice是要重新组合到原来的类中去。也就是说,日志的加入使得类相对于原来的功能有了扩展。因此,称之为Advice(增强)。

Joinpoint

    你做了抽象之后,将日志的代码抽取出去了。那么,在实际使用时你还需要将日志的功能组合进来的。因此,你需要在原来的类中,如上图的那五个子类,留下一个记号。那么这个记号就称之为Joinpoint。它,表示了可以组合Advice的位置。

Aspect

    切面相对上面两个概念来说,稍微有点抽象。那么,把图中的五个子类比作是五个面团。那么日志就是这五个面团中的公共部分,抽象功能部分的功能就相当于将五个面团中的公共部分切除了。那么,拿其中的一个面团来说,它一分为二了。那它怎么才能组合回去呢?实际上是通过你切换出来的公共部分的形状和厚度来决定的。只有厚度和形状吻合才能完美的组合回去。那么在程序代码中我们就将这个形状和厚度抽象成为了切面,它的作用就是维护类和Advice之间的关系。

Pointcut

    这是最后一个概念了,前面说了切面维护了类和advice之间的重新组合的关系。那么,切面和类之间是通过pointcut和joinpoint的匹配来重新组合的。他们就想钥匙和钥匙孔之间的关系。

    总结:OK,主要概念解释道这里了。自己认为这样理解起来是比较合理,也比较深刻的。其实,概念怎么理解并不是那么重要。重要的是,如何去发现这样一个可供抽象的公共功能!!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值