AOP的简单认识

来源:互联网 发布:在化工厂附近居住 知乎 编辑:程序博客网 时间:2024/05/16 09:45

AOP       

    AOP(Aspect Orient Programming),也就是面向切面编程,是OOP(面向对象编程)的延续。AOP带来了新的编程革新。 使得软件设计更加细化,代码的编写顺序不再决定其运行顺序,典型框架有Spring和AspectJ框架。

理解

    面向对象的编程的执行顺序和开发中写入对象之间的调用关系是一致的。面向接口或者加入代理、反射等,都是从纵向上对程序的优化。从时序图里我们可以很明了的了解这种关系,如图:


    AOP是在不破坏这种业务上的调用关系的情况下,在执行过程的中间添加一段逻辑。这样的逻辑和本身的业务逻辑是相互独立的,例如:日志、安全监测、权限验证等。

原理说明

    AOP框架维护者切入点和切入的逻辑的关系。也就是说,具体的每一个切入点对应哪一个切入逻辑是由AOP框架来决定的或者说配置的。如下图:

基本概念(spring为例)

    连接点(Joinpoint)

    表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化、方法执行、方法调用、字段调用或处理异常等等,在AOP中表示为“在哪里做”。

    切入点(Pointcut)

    选择一组相关连接点的模式,即可以认为连接点的集合,Spring支持perl5正则表达式和AspectJ切入点模式,Spring默认使用AspectJ语法,在AOP中表示为“在哪里做的集合”。

    增强(Advice)

    在连接点上执行的行为,增强提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段;包括前置增强(before advice)、后置增强 (after advice)、环绕增强 (around advice),在Spring中通过代理模式实现AOP,并通过拦截器模式以环绕连接点的拦截器链织入增强 ;在AOP中表示为“做什么”。

    方面/切面(Aspect)

    横切关注点的模块化,比如上边提到的日志组件。可以认为是增强、引入和切入点的组合;在Spring中可以使用Schema和@AspectJ方式进行组织实现;在AOP中表示为“在哪里做和做什么集合”。

    目标对象(Target Object)

    需要被织入横切关注点的对象,即该对象是切入点选择的对象,需要被增强的对象,从而也可称为“被增强对象”;由于Spring AOP 通过代理模式实现,从而这个对象永远是被代理对象,在AOP中表示为“对谁做”;

    AOP代理(AOP Proxy)

    AOP框架使用代理模式创建的对象,从而实现在连接点处插入增强(即应用切面),就是通过代理来对目标对象应用切面。在Spring中,AOP代理可以用JDK动态代理或CGLIB代理实现,而通过拦截器模型应用切面。

    织入(Weaving)

    织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期、类装载期、运行期进行。

    引入(inter-type declaration)

    也称为内部类型声明,为已有的类添加额外新的字段或方法,Spring允许引入新的接口(必须对应一个实现)到所有被代理对象(目标对象), 在AOP中表示为“做什么(新增什么)”。

AOP的Advice类型

    前置增强(Before advice):

    在某连接点之前执行的增强,但这个增强不能阻止连接点前的执行(除非它抛出一个异常)。

    后置返回增强(After returning advice):

    在某连接点正常完成后执行的增强:例如,一个方法没有抛出任何异常,正常返回。

    后置异常增强(After throwing advice):

    在方法抛出异常退出时执行的增强。

    后置最终增强(After (finally) advice):

    当某连接点退出的时候执行的增强(不论是正常返回还是异常退出)。

    环绕增强(Around Advice):

    包围一个连接点的增强,如方法调用。这是最强大的一种增强类型。 环绕增强可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。

优点:

  • 降低模块的耦合度
  • 使系统容易扩展
  • 设计决定的迟绑定:使用AOP,设计师可以推迟为将来的需求作决定,因为它可以把这种需求作为独立的方面很容易的实现。
  • 更好的代码复用性
总结:AOP其实就是将程序中和业务无关的代码抽离出来,然后以某种机制在运行中将这些抽离的代码插入到执行流程里去。重要的是,插入的点和插入的代码之间的关系是在目标类的外部来维护的,这就保证了其独立性。

0 0
原创粉丝点击