我所知道的AOP

一、术语:

    1.通知(Advice) 

    想要的功能,如安全,事物,日志等。先定义好,然后在想用的地方用一下。 
    2.连接点(JoinPoint) 
    spring允许你使用通知的地方,spring只支持方法连接点,和方法有关的前前后后(抛出异常),都是连接点。
    3.切入点(Pointcut) 
    你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,以后再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
    4.切面(Aspect) 
    通知和切入点的结合。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),切入点说明了在哪干(指定到底是哪个方法)

    5.引入(introduction) 
    把切面用到目标类中
    6.目标(target) 
    引入中所提到的目标类
    7.代理(proxy) 
    怎么实现整套aop机制的,都是通过代理
    8.织入(weaving) 
    把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时,为什么是运行时,后面解释。 
关键就是:切点定义了哪些连接点会得到通知

二、AOP原理

    核心思想:spring用代理类包裹切面,把他们织入到Spring管理的bean中。也就是说代理类伪装成目标类,它会截取对目标类中方法的调用,让调用者对目标类的调用都先变成调用伪装类,伪装类中就先执行了切面,再把调用转发给真正的目标bean。

  如何伪装:   1、实现和目标类相同的接口,我也实现和你一样的接口,反正上层都是接口级别的调用,这样我就伪装成了和目标类一样的类(实现了同一接口,咱是兄弟了),也就逃过了类型检查,到java运行期的时候,利用多态的后期绑定(所以spring采用运行时),伪装类(代理类)就变成了接口的真正实现,而他里面包裹了真实的那个目标类,最后实现具体功能的还是目标类,只不过伪装类在之前干了点事情(写日志,安全检查,事物等)。

        2、生成子类调用,这次用子类来做为伪装类,当然这样也能逃过JVM的强类型检查,我继承的吗,当然查不出来了,子类重写了目标类的所有方法,当然在这些重写的方法中,不仅实现了目标类的功能,还在这些功能之前,实现了一些其他的(写日志,安全检查,事物等)。

  两种伪装方式的对比:前一种兄弟模式,spring会使用JDK的java.lang.reflect.Proxy类,它允许Spring动态生成一个新类来实现必要的接口,织入通知,并且把对这些接口的任何调用都转发到目标类。后一种父子模式,spring使用CGLIB库生成目标类的一个子类,在创建这个子类的时候,spring织入通知,并且把对这个子类的调用委托到目标类。对于面向接口编程是一个最佳实践,所以很多类都是实现一个或者多个接口。

原文地址:https://www.cnblogs.com/xiao-dl/p/8862102.html