我们说说AOP。之所以接着说AOP 是因为,我认为代理模式和AOP 本就是一家,AOP是一种很先进的思想,而这种思想的技术支撑是:动态代理。最初,我也没有发现他们的关系,后来走着走着,就从AOP学回到到动态代理了,发现,原来是AOP的实现机制之一就是有“动态代理”的支持。回归正题,我们先说说什么是AOP?
AOP : Aspect Oriented Programming 面向切面编程。它是为解耦而生的。
解耦是程序员编码开发过程中一直追求的境界。AOP在这方面给程序员带来的福音,在对业务类的隔离方面来说,它绝对是做到了解耦,但绝不是完美的解耦,这里在接下来的博客中再做介绍,这篇博客的主题是理解AOP。AOP的具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流,找一个简单的业务为例来说:
从图中看出,AOP对我们的业务的纵向走势不会造成阻碍作用,所以所面向切面变成是对面向对象编程的一种补充。上图是简单的一个AOP横向逻辑切入业务逻辑纵向逻辑的一个直挂展示,有些人会问?为什么要这样做?我们有那么多的横切行的必要吗?现在我们看看使用AOP可以帮助我们避免那些问题?基本算是AOP的一个由来吧。
先来看第一个问题,aop解决了大量的代码重复。
我需要做一个日志的功能,即需要在每条线上都进行日志的处理,我们是不是要这么写?
这样有很多条线中都包含了一段相同的代码,你怎么看?抽出来呗,作为公共的部分,被调用。
然后呢,到这里我们还没有结束,为什么这么说?
这样每个方法都和这个公共的功能类有关联关系,这里只是我们的抽出公共代码,解决了代码重复。我们需要做的是“解耦”,将业务类和这个公共的功能类之间的耦合解开,在运行的时候动态的给切入到每个运行的业务类中,那么怎么实现呢?
AOP实现业务和切入类的解耦。
AOP是如何实现的呢?借助动态代理。前几篇博客我们说了动态代理,动态代理的一个最大特征就是可以延迟对象的加载,即在运行期再确定调用者和被调用者的关系。AOP也就是利用了动态的这个特征来实现的解耦。具体我就不多说了,详情看代码。
AOP的主要应用
直接上图吧。
这张图也形象的展示了,软件的纵向业务发展,和软件的横向AOP切入的原理。我觉得以后,我们的开发可以更多的抽取这样的切面,让每个系统的开发只专注于核心的业务,而不考虑这样,那样的共性问题。