二、AOP原理和基本概念

 

What is AOP

AOPAspect-Oriented Programming的缩写,中文意思是面向切面(或方面)编程。AOP实际上是一种编程思想,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种思想

在传统的面向对象(Object-Oriented Progr ammingOOP)编程中,我们总是按照某种特定的执行顺序来实现业务流程,各个执行步骤之间是相互衔接、相互耦合的,对垂直切面关注度很高,横切面关注却很少,也很难关注。那么怎样可以解决这个问题呢?我们需要AOP,关注系统的切面,在适当的时候拦截程序的执行流程,把程序的预处理和后处理交给某个拦截器来完成。这样,业务流程就完全的从其它无关的代码中解放出来,各模块之间的分工更加明确,程序维护也变得容易多了。

正如上所说,AOP不是一种技术,而是编程思想。凡是符合AOP思想的技术,都可以看成是AOP的实现。目前的AOP实现有AspectJJBoss4.0nanningspring等项目。其中SpringAOP进行了很好的实现,同时Spring AOP也是Spring的两大核心一。

      AOP的发展目前已经历了两个阶段:第一阶静态AOP和第二阶段动态AOP。静态AOP阶段,相应的横切关注点以Aspect形式实现之后,会通过特定的编译器,将实现后的Aspect编译并织入到系统的静态类中。比如AspectJ会使用ajc编译器将各个AspectJava字节码的形式编译到系统的各个功能模块中,已达到融合AspectClass的目的。动态AOP阶段,AOP的织入过程在系统运行开始之后进行,而不是预先编译到系统中,可以在调整织入点以及织入逻辑单元的同时,不必变更系统其他的模块,甚至在系统运行的时候,也可以动态更改织入逻辑。这两个阶段也为我们提供了通过预编译方式和运行期动态代理方式,实现了在不修改源代码的情况下给程序统一添加功能的目的。

      AOP主要的意图是:允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发。应用对象只实现业务逻辑即可,并不负责其它的系统级关注点。

      AOP主要应用场景是:日志记录、跟踪、监控和优化,性能统计、优化,安全、权限控制,应用系统的异常捕捉及处理,事务处理,缓存,持久化,懒加载(Lazy loading),内容传递,调试,资源池,同步等等。

     

 

AOP的相关概念

Joinpoint:在系统运行之前,AOP的功能模块都需要织入到OOP的功能模块中。所以,要进行这种织入过程,我们需要知道在系统的那些执行点上进行织入操作。这些将要在其上进行织入操作的系统执行点就称之为Joinpoint。(在Spring AOP 中仅支持方法级别的Joinpoint

Pointcut:代表的是Joinpoint的表达方式。将横切逻辑织入当前系统的过程中,需要参照Pointcut规定的Joinpoint信息,才可以知道应该往系统的哪些Joinpoint上织入横切逻辑。

Pointcut指定系统中符合条件的一组Joinpoint

       Advice是单一横切关注点逻辑的载体,代表将会织入到Joinpoint处的横切逻辑。如果将Aspect比作OOP中的Class,那么Advice就相当于Class中的Method。按照AdviceJoinpoint处执行时机的差异或者完成功能的不同,Advice可分成以下具体形式:Before Advice,After Advice(Afterreturning AdviceAfterThrowing AdviceAfterFinally Advice),Around Advice,Introduction

      Aspect是对体统中的横切关注点逻辑进行模块化封装的AOP概念实体。Aspect可以包含多个Pointcut以及相应的Advice定义。

      织入:完成横切关注点逻辑(以Aspect模块化的横切关注点)到OOP系统的过程。

 

 

SpringAOP的实现机制:

       Spring AOP采用动态代理机制和字节码生成技术实现。与第一代AspectJ采用编译器将横切逻辑织入目标对象不同,动态代理机制和字节码生成都是在运行期间为目标对象生成一个代理对象,而将横切逻辑织入到这个代理对象中,系统最终使用的是织入了横切逻辑的代理对象,而不是真正的目标对象。

      默认情况下,如果Spring AOP发现目标对象实现了相应Interface,则采用动态代理机制为其生成代理对象实例。而如果目标对象没有实现任何InterfaceSpring AOP会尝试使用CGLIB(Code Generation Library)这种动态字节码生成类库,为目标对象生成动态的代理对象实例。

 

SpringAOP中需注意的相应概念实体:

<!–[if !supportLists]–> 1.Around Advice

Spring中没有直接定义对应Around Advice的实现接口,而是直接采用AOP Alliance

的标准接口,即org.aopalliance.intercept.MethodInterceptor,该接口定义如下:

Public interfaceMethodInterceptor extends Interceptor{

      Object invoke(MethodInvocation invocation)throws Throwable;

}

通过MethodInterceptorinvoke方法的MethodInvocation参数,我们可以控制对相应的Joinpoint的拦截行为。通过调用MethodInvocationproceed()方法,可以让程序执行继续沿着调用链传播。如果在哪一个MethodInterceptor中没有调用proceed(),那么程序的执行将会在当前MethodInterceptor处“短路”,Joinpoint上的调用链将被中断,同一Joinpoint上的其他MethodInterceptor的逻辑以及Joinpoint出的方法逻辑将不会被执行。

<!–[if !supportLists]–> 2.Spring AOP中的Aspect

AdvisorSpring中用的Aspect。但是,与正常的Aspect不同,Advisor通常只持有一个Pointcut和一个advice。而理论上,Aspect定义中可以有多个Pointcut和多个Advice。所以,我们认为advisor是一种特殊的Aspect

<!–[if !supportLists]–> 3.Spring AOP的织入

Spring AOP中,使用类org.springframework.aop.framework.ProxyFactory作为织入器。在IoC容器中,使用org.springframework.aop.framework.ProxyFactoryBean作为织入器。

AspectJ采用ajc编译器作为织入器。JBOSS AOP使用自定义的ClassLoader作为织入器)

 

    原文作者:AOP
    原文地址: https://blog.csdn.net/zhaonanemail/article/details/6571873
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞