美文网首页
cglib 动态代理

cglib 动态代理

作者: hehehehe | 来源:发表于2020-11-12 13:31 被阅读0次

    https://www.cnblogs.com/rinack/p/7742682.html

    JDK动态代理是基于接口的方式,换句话来说就是代理类和目标类都实现同一个接口,那么代理类和目标类的方法名就一样了,CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法啊,这样也可以保证代理类拥有目标类的同名方法
    aop底层实现:基于JDK的动态代理 和 基于Cglib的动态代理
    aop的重点概念:
    Pointcut(切入点):被增强的方法
    Advice(通知/ 增强):封装增强业务逻辑的方法
    Aspect(切面):切点+通知
    Weaving(织入):将切点与通知结合的过程

    jdk动态代理
    public interface TargetInterface {
       public void method();
    }
    
    public class Target implements TargetInterface {
        @Override
        public void method() {
            System.out.println("Target running....");
        }
    }
    Target target = new Target(); //创建目标对象
    //创建代理对象
    TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(target.getClass()
    .getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) 
                throws Throwable {
                    System.out.println("前置增强代码...");
                    Object invoke = method.invoke(target, args);
                    System.out.println("后置增强代码...");
                    return invoke;
                }
            }
    );
    
    // 测试,当调用接口的任何方法时,代理对象的代码都无需修改
    proxy.method();
    
    cglib 的动态代理

    cglib 创建某个类A的动态代理类的模式是:

    1. 查找A上的所有非final的public类型的方法定义;
    2. 将这些方法的定义转换成字节码;
    3. 将组成的字节码转换成相应的代理的class对象;
    4. 实现MethodInterceptor接口,用来处理对代理类上所有方法的请求(这个接口和JDK动态代理InvocationHandler的功能和角色是一样的)
    package samples;  
    /** 
     * 程序猿类 
     * @author louluan 
     */  
    public class Programmer {  
      
        public void code()  
        {  
            System.out.println("I'm a Programmer,Just Coding.....");  
        }  
    }
    
    package samples;  
      
    import java.lang.reflect.Method;  
      
    import net.sf.cglib.proxy.MethodInterceptor;  
    import net.sf.cglib.proxy.MethodProxy;  
    /* 
     * 实现了方法拦截器接口 
     */  
    public class Hacker implements MethodInterceptor {  
        @Override  
        public Object intercept(Object obj, Method method, Object[] args,  
                MethodProxy proxy) throws Throwable {  
            System.out.println("**** I am a hacker,Let's see what the poor programmer is doing Now...");  
            proxy.invokeSuper(obj, args);  
            System.out.println("****  Oh,what a poor programmer.....");  
            return null;  
        }  
      
    }
    
    
    package samples;  
      
    import net.sf.cglib.proxy.Enhancer;  
      
    public class Test {  
      
        public static void main(String[] args) {  
            Programmer progammer = new Programmer();  
              
            Hacker hacker = new Hacker();  
            //cglib 中加强器,用来创建动态代理  
            Enhancer enhancer = new Enhancer();    
                     //设置要创建动态代理的类  
            enhancer.setSuperclass(progammer.getClass());    
                   // 设置回调,这里相当于是对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实行intercept()方法进行拦截  
                    enhancer.setCallback(hacker);  
                    Programmer proxy =(Programmer)enhancer.create();  
                    proxy.code();  
              
        }  
    }
    
    package samples;  
      
    import java.lang.reflect.Method;  
    import net.sf.cglib.core.ReflectUtils;  
    import net.sf.cglib.core.Signature;  
    import net.sf.cglib.proxy.Callback;  
    import net.sf.cglib.proxy.Factory;  
    import net.sf.cglib.proxy.MethodInterceptor;  
    import net.sf.cglib.proxy.MethodProxy;  
      
    public class Programmer
    EnhancerByCGLIB
    fa7aa2cd extends Programmer  
      implements Factory  
    {  
       //......省略  
      private MethodInterceptor CGLIB$CALLBACK_0;  // Enchaner传入的methodInterceptor  
       // ....省略  
      public final void code()  
      {  
        MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0;  
        if (tmp4_1 == null)  
        {  
          tmp4_1;  
          CGLIB$BIND_CALLBACKS(this);//若callback 不为空,则调用methodInterceptor 的intercept()方法  
        }  
        if (this.CGLIB$CALLBACK_0 != null)  
          return;  
          //如果没有设置callback回调函数,则默认执行父类的方法  
          super.code();  
      }  
       //....后续省略  
    }
    

    相关文章

      网友评论

          本文标题:cglib 动态代理

          本文链接:https://www.haomeiwen.com/subject/wcfpbktx.html