SpringAOP ApectJ 动态代理

参考链接:https://docs.spring.io/spring/docs/4.3.13.RELEASE/spring-framework-reference/htmlsingle/#aop

http://blog.csdn.net/javazejian/article/details/56267036

一.AspectJ

AspectJ是一个java实现的AOP框架,它能够对java代码进行AOP编译(一般在编译期进行),让java代码具有AspectJ的AOP功能(当然需要特殊的编译器),可以这样说AspectJ是目前实现AOP框架中最成熟,功能最丰富的语言,更幸运的是,AspectJ与java程序完全兼容,几乎是无缝关联。在使用时,我们首先使用aspect关键字定义了一个类,这个类就是一个切面,它可以是单独的日志切面(功能),也可以是权限切面或者其他,在切面内部需要使用pointcut定义了切点,而所谓的切点就是那些需要应用切面的方法,pointcut就是定义这些需要捕捉的方法(常常是不止一个方法的),这些方法也称为目标方法,最后还需要定义了通知,通知就是那些需要在目标方法前后执行的函数,如before()即前置通知在目标方法之前执行,另一个是after()即后置通知。到这里也就可以确定,切面就是切点和通知的组合体,组成一个单独的结构供后续使用。

通知的5种类型分别如下:

  • before 目标方法执行前执行,前置通知
  • after 目标方法执行后执行,后置通知
  • after returning 目标方法返回时执行 ,后置返回通知
  • after throwing 目标方法抛出异常时执行 异常通知
  • around 在目标函数执行中执行,可控制目标函数是否执行,环绕通知

静态代理:AspectJ主要采用的是编译期织入,在这个期间使用AspectJ的acj编译器(类似javac)把aspect类编译成class字节码后,在java目标类编译时织入,即先编译aspect类再编译目标类,AspectJ本质是编译期即完成的静态代理。

SpringAOP ApectJ 动态代理

 二.Spring AOP的实现原理概要

Spring AOP的实现原理是基于动态织入的动态代理技术,而AspectJ则是静态织入,而动态代理技术又分为Java JDK动态代理和CGLIB动态代理,前者是基于反射技术的实现,这里的反射指的是通过调用反射方法method.invoke(target, args);;后者是基于继承的机制实现,下面通过一个简单的例子来分析这两种技术的代码实现,CGLIB更接近ASpectJ的实现原理。