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

得出结果:


 

posted @ 2017-02-27 19:15  张昊亮  阅读(324)  评论(0编辑  收藏  举报