zoukankan      html  css  js  c++  java
  • CGLib代理

    何为CGLib ,百度百科给出了解释如下:

    Spring框架,如果类实现了接口,就使用JDK的动态代理生成代理对象,如果这个类没有实现任何接口,使用CGLIB生成代理对象.JDk强制要求必须有接口来实现动态代理,然而CGLib代理不需要必须有接口才能实现代理,而是通过一种类似“继承”的关系来实现代理的。

    JDK动态代理小案例博客地址: http://www.cnblogs.com/zhanghaoliang/p/6475636.html

    ProductDao被代理的类,CGLibproxy代理类,CGLibTest测试类

    想要使用CGLib要先下载CGLib的jar包,但是Spring核心包(core包)已经集成了CGLib,Spring开发下不用导入专门的CGLib的包。

    ProductDao要被代理的类

    public class ProductDao {
    
        public void add() {
    
            System.out.println("添加商品");
        }
    
        public void update() {
    
            System.out.println("修改商品");
        }
    }


    CGLibproxy

    public class CGLibproxy implements MethodInterceptor {
    
        private ProductDao productDao;
    
        public CGLibproxy(ProductDao productDao) {
    
            super();
            this.productDao = productDao;
        }
    
        // 使用CGLib生成代理
        public ProductDao createProxy() {
    
            // 1.创建核心类
            Enhancer enhancer = new Enhancer();
            // 2.为其设置父类
            enhancer.setSuperclass(productDao.getClass());
            // 3.设置回调
            enhancer.setCallback(this);
            // 4.创建代理
            return (ProductDao) enhancer.create();
        }
    
        @Override
        public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    
            if ("add".equals(method.getName())) {
                System.out.println("添加之前的操作。。。。。。");
                Object object = methodProxy.invokeSuper(proxy, args);
                return object;
            }
    
            return methodProxy.invokeSuper(proxy, args);
        }
    
    }


    CGlibTest 测试类

    public class CGlibTest {
    
        @Test
        public void testDemo() {
    
            ProductDao productDao = new ProductDao();
            ProductDao proxy = new CGLibproxy(productDao).createProxy();
            proxy.add();
            proxy.update();
        }
    }

    得出结果:


  • 相关阅读:
    使用ngx_lua构建高并发应用(1)
    nginx+lua项目学习
    学习乱
    if---(switch-case)语句初步学习总结
    数据类型转换
    总结:C#变量,占位符等相关知识
    学习随笔
    开始我的.NET的学习旅程
    Python 网络爬虫 008 (编程) 通过ID索引号遍历目标网页里链接的所有网页
    Python 网络爬虫 007 (编程) 通过网站地图爬取目标站点的所有网页
  • 原文地址:https://www.cnblogs.com/zhanghaoliang/p/6475877.html
Copyright © 2011-2022 走看看