美文网首页
java代理之cglib代理

java代理之cglib代理

作者: Restart白蓝 | 来源:发表于2020-12-10 17:31 被阅读0次

上一篇
JDK的动态代理
JDK这个动态代理呢,有个缺点,就是目标类(被代理的类)没有实现任何接口,那么增强类也不能去对应实现接口,也就没办法用了。

但是可以使用cglib代理来解决这个问题
cglib与动态代理最大的区别就是
1.使用动态代理的对象必须实现一个或多个接口
2.使用cglib代理的对象则无需实现接口,达到代理类无侵入。

spring 的AOP底层 就是有JDK的动态代理和cglib的动态代理,找不到接口时他就会用cglib。

使用cglib需要引入jar包,如果你已经有spring-core的jar包,则无需引入,因为spring中包含了cglib,并且如果引入的是spring-context那么也不需要,因为context又包涵了core.


image.png

需求还是和前面一样,但是现在没有实现任何接口了。

一、先创建一个订单处理的类。

package proxy;

/**
 * 目标类(被代理类)
 */
public class Order {

    public String sell(String name) {
        System.out.println("出售了商品" + name);
        return name;
    }

    public String show() {
        String s = "所有商品";
        System.out.println("查看所有商品");
        return s;
    }
}

二、再写一个订单的增强类


package proxy;

/**
 * Order的增强类
 */
public class PagerintiOrder {
    public void init() {
        System.out.println("售前准备");
    }

    public void last() {
        System.out.println("售后记录");
    }

}

三、直接就可以写个测试类来测试了

package proxy;

import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;


public class CglibTest {
    //目标类(被代理类)
    Order order = new Order();
    //增强类
    PagerintiOrder pagerintiOrder = new PagerintiOrder();

    @Test
    public void pagerintiOrderTest() {
        //创建一个增强器
        Enhancer enhancer = new Enhancer();

        //设置父类
        enhancer.setSuperclass(Order.class);
        //设置回调
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                pagerintiOrder.init();
                String invoke = (String) method.invoke(order, objects);
                pagerintiOrder.last();
                return "赠送键盘," + invoke;
            }
        });
        //测试
        Order o = (Order) enhancer.create();
        String s = o.sell("电脑1");
        System.out.println(s);
    }
}

四、查看结果

有木有,更加方便了呢。


image.png

相关文章

  • 源码基础 -- 动态代理(2)

    再看java动态代理之Cglib动态代理,早期大家选择Cglib主要是因为Cglib底层采用ASM字节码生成框架,...

  • Java 代理

    静态代理 动态代理 JDK 提供的Proxy CGLib cglib | GitHub 参考文章 Java的三种代理模式

  • java动态代理(JDK和cglib)(转载自http://ww

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是...

  • java代理之cglib代理

    上一篇JDK的动态代理[https://www.jianshu.com/p/b1ec5d2d36a1]JDK这个动...

  • 设计模式之代理

    设计模式之代理模式 一、定义 在Java中代理的实现一般分为三种:JDK静态代理、JDK动态代理以及CGLIB动态...

  • 动态代理的两种方式

    静态代理就不说了,基本用到的都是动态代理。 Java中动态代理有JDK动态代理和CGLIB动态代理。 JDK代理的...

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

  • java设计模式之代理

    概述 java代理模式分为三种 静态代理 动态代理 Cglib代理 作用:给某一个对象提供代理对象,并由代理对象控...

  • Java 动态代理

    前言 关于动态代理 JDK动态代理 CGLIB动态代理 区别 java动态代理是利用反射机制生成一个实现代理接口的...

  • 六大原则 动态代理

    参考 六大原则 代理模式 介绍了三种代理:静态代理、Proxy、cglib java 动态代理详解介绍了动态代理具...

网友评论

      本文标题:java代理之cglib代理

      本文链接:https://www.haomeiwen.com/subject/sfqkgktx.html