• 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则无法进行代理。








     
     
  • 相关阅读:
    JDBC数据库连接池的实现
    在java项目中引入dll文件
    动态调用WebService(支持SaopHeader)
    获取CPU,硬盘,网卡信息
    js调用本地程序
    ClickOnce发布的一点小经验总结
    为程序设置快捷键
    构建返回友好信息的WebService
    使用DataReader分页的测试
    【bug】internal class GetCountOfEntitiesByCriterionHibernateCallback : IHibernateCallback<int>
  • 原文地址:https://www.cnblogs.com/-Aiai/p/15210992.html
Copyright © 2020-2023  润新知