AOP即Aspect Oriented Programming-面向切面编程,可以通过预编译方式和运行期动态代理方式,实现在不修改代码的情况下,给程序动态统一添加功能的一种技术。
AOP是横向插入的一种技术,在不影响业务总体纵向流程的情况下横向切进了一段逻辑。
横切关注点:跨越应用程序多个模块的方法或功能。(软件系统,可以看做由一组关注点即业务或功能或方法组成。其中,直接的业务关注点是直切关注点,而为直切关注点服务的,就是横切关注点。)即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。
切面(ASPECT):横切关注点被模块化的特殊对象。即,它是一个类。
通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。
目标(Target):被通知对象。
代理(Proxy):向目标对象应用通知之后创建的对象。
切入点(PointCut):切面通知执行的“地点”的定义。
连接点(JointPoint):与切入点匹配的执行点。
下面示意图:
AOP的主要编程对象是切面(ASPECT),横切关注点抽象(模块化)就是切面。这几个术语的描述比较抽象,我们通过一个简单的例子说明。
----Demo
假如我的DAO层在执行增删改查的时候需要验证权限,而这个权限的验证跟我真正的业务流程是没有关系的,所以我可以把验证的功能抽取出来。这个权限验证的功能或者说业务就是横切关注点,是我要关注的部分。
然后我把这个功能单独拿出来,写个类。这个类就是切面(Aspect),切面是横向关注点的抽象、模块化。
在切面这个类中,我可以写个方法,这个方法是具体执行权限验证的。这个方法就是我们定义的通知(Advice),描述了具体要执行的工作。
此外,还要说明切入点(PointCut),即我们定义的通知(advice)要执行的地方,在这个例子中,切入点(PointCut)就是Dao层里的增删改查方法。
----
利用AOP横向添加进去的功能一般与业务主体无关,且复用性高,例如记录日志,性能统计,安全控制,事务处理,异常处理等。
将这些比较公用的逻辑从业务代码中划分出来,通过分离,我们可以将它们独立到非主导业务逻辑的单独方法中。
这样就把与业务逻辑无关的逻辑部分进行隔离,从而改变这些行为的时候,不影响业务逻辑代码。使得业务逻辑各个部门之间的耦合度降低,提高程序的可重用性,同时因为高服用提高了开发效率。
AOP不仅是Spring的核心之一,也是OOP思想的延续。AOP实在OOP设计的基础上,针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各个部门之间低耦合性的隔离效果。
AOP不仅仅是技术,也是一种编程思想。
原文地址:http://blog.csdn.net/biezhihua/article/details/37964669