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;
        }

    }

  • 相关阅读:
    【tips】Clion添加Qt gui绘制快捷方式
    conda配置安装pytorch tensorflow-gpu
    用当前最新版vs2019编译opencv最新版4.3.0遇到的问题---
    cuda报错: nvcc fatal : Host compiler targets unsupported OS
    C++中结构体与类的区别(struct与class的区别)
    cmake
    Windows 下配置Boost MPI
    VC----MFC对象的创建总结
    VC++、MFC最好的开源项目
    机械设计人员怎么学习电控?
  • 原文地址:https://www.cnblogs.com/shizhongyang/p/7147548.html
Copyright © 2011-2022 走看看