23种设计模式-动态代理(Cglib代理)

1.静态代理和JDK代理模式都要求对象是实现一个接口,但是有目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理-这就是Cglib代理
2.Cglib代理也叫子类代理,它是在内存中构建一个子类对象从而实现对目标对象的功能扩展,有些书也将Cglib代理归属到动态代理。
3.Cglib是一个强大的高细性能的代码生成包,它可以在运行期扩展java类与实现java接口,它广泛的被许多AOP的框架使用,例如Spring AOP,实现方法拦截
4.在AOP编程中如何选择代理模式:
1)目标对象需要实现接口,用JDK代理
2)目标对象不需哟啊实现接口,用Cglib代理
5.Cglib包底层是通过使用资字节码处理框架ASM来转换字节码并生成新的类。

在这里插入图片描述

public class TeacherDao  {
    public void teach() {
        System.out.println("老师授课中 , 我是cglib代理,不需要实现接口 ");
    }
}

public class ProxyFactory implements MethodInterceptor {

    //维护一个目标对象
    private Object target;

    //构造器,传入一个被代理的对象
    public ProxyFactory(Object target) {
        this.target = target;
    }

    //返回一个代理对象:是target对象的代理对象
    public Object getProxyInstance(){
        //1.创建一个工具类
        Enhancer enhancer=new Enhancer();
        //2.设置父类
        enhancer.setSuperclass(target.getClass());
        //3.设置回调函数
        enhancer.setCallback(this);
        //4.创建子类对象,即代理对象
        return enhancer.create();
    }

    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("Cglib代理模式~~开始");
        Object returnValue = method.invoke(target, args);
        System.out.println("Cglib代理提交~~开始");
        return returnValue;
    }
}

public class Client {
    public static void main(String[] args) {
        TeacherDao teacherDao=new TeacherDao();
        ProxyFactory proxyFactory=new ProxyFactory(teacherDao);
        TeacherDao proxyInstance = (TeacherDao)proxyFactory.getProxyInstance();
        proxyInstance.teach();
    }
}

总结:cglib基于继承,jdk代理模式基于接口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值