zoukankan      html  css  js  c++  java
  • 动态代理(CGLIB实现)

    CGLIB(Code Generation Library)是一个开源项目。可以直接对类进行增强,而不需要像JDK的动态代理,需要增强的类必须实现某接口

    在使用Spring框架时,因为Spring框架中core包中引入了cglib所以如果想通过cglib来实现动态代理,不需要专门的导cglib的jar包。

    创建代理工厂时,必须得实现MethodInterceptor接口,因为通过cglib创建的代理对象在调方法时会默认执行intercept方法,通过该方法增加目标对象方法。

    public class CglibProxyFactory implements MethodInterceptor {

        //通过构造方法,把目标对象传进来
        private Object target;
        public CglibProxyFactory(Object target) {
            this.target = target;
        }
        
        //得到代理对象
        public Object getProxyObject() {
            Enhancer enhancer = new Enhancer();           //实例化cglib代理增强器-
            
            enhancer.setSuperclass(target.getClass());    //设置目标的类:通过目标类对象来生成代理子对象
            
            enhancer.setCallback(this);                   //回调方法        参数:回调的对象
            
            return enhancer.create();                     //  通过增强器得到代理对象
        }
        
        //增强目标对象方法
        @Override
        public Object intercept(
                Object proxy,                           //代理对象
                Method method,                      //目标对象的方法
                Object[] args,                          //需要增强的方法的参数
                MethodProxy proxyMethod     //代理对象的方法继承目标对象的方法(method)
                ) throws Throwable {
            
            System.out.println("前置增强");
            
            //直接调用目标对象的方法(目标方法执行方式1)
            Object value =  method.invoke(target, args);
            
            //调用代理代理对象的父类方法,相当于间接调用目标对象的方法(目标方法执行方式2)
             Object value = proxyMethod.invokeSuper(proxy, args);
            
             System.out.println("后置增强");
            
             return value;
        }

    }

  • 相关阅读:
    阻止事件冒泡
    移动端开发
    angular6 管道多参数传输 Pipe
    在div上添加小三角
    angular6 使用@Input() @Output()
    angular6 想要获取页面某些事件 如 点击 window宽高等等
    如何将项目添加到git上
    使用vue-cli 搭建element-admin后台
    bootstrap4 常用样式类名 (供自己参考)
    键盘按下 keyCode 的值
  • 原文地址:https://www.cnblogs.com/shizhongyang/p/7147548.html
Copyright © 2011-2022 走看看