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

}

最新文章

  1. iDB是如何运转的 一
  2. Groovy学习笔记(二)
  3. win server2008R2安装framework1.1后,在应用池中不能编辑选择framework1.1的解决办法
  4. poj: 1207
  5. Cocos2d-x利用CCHttpRequest获取网络图片并显示
  6. HDU 4325-Flowers(线段树+离散化)
  7. K - Candies(最短路+差分约束)
  8. CF#345 div2 A\B\C题
  9. Int16 Int32 Int64
  10. JQuery和原生JS跨域加载JSON数据或HTML。
  11. 微信原始demo
  12. PCA算法数学原理及实现
  13. 【PHP篇】输出方法
  14. js中const,var,let区别(转载)
  15. Mysql的用户管理
  16. 《微信小程序组件》收集
  17. python之参数解包
  18. go语言学习--protobuf的学习
  19. DOM操作之属性和样式操作
  20. 【校招面试 之 剑指offer】第10-1题 斐波那契数列

热门文章

  1. 解决Notepad++ Plugin Manager无法加载插件的方法
  2. SOAP 版本可能不匹配: 出现意外的 Envelope 命名空间 http://schemas.xmlsoap.org/wsdl/
  3. MongoDB中使用的SCRAM-SHA1认证机制
  4. 微软AntiXSS防止xss攻击类库
  5. Golang之实现一个负载均衡算法(随机,轮询)
  6. Linux gperf命令
  7. chrome扩展安装图文教程
  8. [模板]tarjan缩点+拓扑排序
  9. CTF中的变量覆盖漏洞
  10. Android的/system/lib里加入自己的so库