spring aop 三种代理模式

https://www.cnblogs.com/qlqwjy/p/7550609.html

aop思想:   不要去随意修改别人已经写好的代码或者方法  ,如果需要去修改 ,可以通过代理的方式来扩展该方法!


   静态代理:需要自己去实现接口, 通过这个接口去实现代理对象 在需要修改原本的方法或者代码上扩展逻辑  

      缺点:简单来说 ……需要具体方法具体对待


   动态代理 :这个不需要自己去实现接口, 因为动态代理又叫  JDK代理  因为接口JDK中生成代理对象的API代理类所在包:java.lang.reflect.Proxy 

      Proxy类对象中有一个方法static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h ) 

      ClassLoader loader   参数:指定当前目标对象使用类加载器,获取加载器的方法是固定的

      Class<?>[] interfaces 参数:目标对象实现的接口的类型,使用泛型方式确认类型

      InvocationHandler h 参数:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入

new InvocationHandler() 里面有一个方法叫 invoke 运用反射执行目标对象方法
(目标对象一定要实现接口)目标对象指的是我们业务层接口 ,否则不能用动态代理



  Cglib代理基于继承的方式实现(也叫子类代理),在需要代理的对象没有接口的时候, 可以当做目标对象的子类代理
  实现了一个
MethodInterceptor的接口 ,重写了下里面的Interceptor 包含是个参数
     * 1、代理对象;2、委托类方法;3、方法参数;4、代理方法的MethodProxy对象。
     *
     * @param o
     * @param method
     * @param objects
     * @param methodProxy 
  这里
methodProxy.invokeSuper(o, objects);   中的this指向的是目标对象中的代理对那个
methodProxy.invoke(o, objects);  中的 this 指向的是目标对象

引入功能包后,就可以在内存中动态构建子类(就是我们需要扩展的目标对象)
代理的类不能为final,否则报错
目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法.
如果方法为static,private则无法进行代理。








 
 
原文地址:https://www.cnblogs.com/-Aiai/p/15210992.html