静态代理,cglib动态代理,jdk动态代理区别以及流程详解

1.静态代理

静态代理使用的是代理设计模式,不讲高大上的思想,我们直接实战

这是动物接口,其中有一个吃饭方法
在这里插入图片描述
这是其中的一只动物,实现了动物接口,覆盖了吃饭方法
在这里插入图片描述现在我们思考,我想要给猫找一个代理,希望能够在猫吃饭前先洗手,吃饭后漱口,大家的实现一定是这样的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

到这里,其实我们已经完成了代理模式的设计,有什么好处呢?
代理模式好处:
1.保护真实对象
2.能够扩展对象的方法
3.让原本类的职责更明确
解释:
以后不用再去new猫了,直接new 代理猫,本质上代理猫内部和原来的猫都是同一样的方法,可以保护猫,在保护猫的访问的同时,我们可以扩展猫的操作,在猫原本的方法上进行扩展,并且猫的职责就是吃,他什么也不用管,职责更明确
缺点:
如果我们在Animal接口中再添加一个方法呢?
那么我们需要再覆盖这个方法继续写重复的代码,由此引发出动态代理

2. 动态代理

到此我们应该明确动态代理需要做什么: 我们只需要一个洗手,漱口,当animal方法增多时,自动为每一个方法前后添加洗手,漱口

1). jdk动态代理
我们先画一个图来说明jdk动态代理做了些什么
在这里插入图片描述其实jdk的动态代理将需要代理的对象的接口给实现了,出现一个ProxyCat的代理猫,它里面有eat方法,下面我们创建一个代理猫,创建代理猫需要一个方法(死记住)
在这里插入图片描述第一个参数是传入Animal类的加载器,第二个参数是你Cat类的接口的class数组,有几个写几个,第三个参数是方法调用时,我们具体调用的方法和需要添加的事情(洗手,漱口),这里先留null
在这里插入图片描述在这里我们如果强行调用的话,会没有具体的实现而报错,因为我们的ProxyCat只是根据一个接口创建出来的,没有具体的实现!在这里插入图片描述
接下来我们完善第三个参数,这个参数需要传进去一个类,这个类需要实现InvocationHandler接口,覆盖invoke方法,
在这里插入图片描述我们先什么都不做,只在invoke中输出一个ok,然后传进入参数看看有什么现象
在这里插入图片描述在这里插入图片描述
由此我们可以得出,创建出来的代理猫,其实是一个jdk帮我们实现的Animal子类,在调用这个子类方法时,实际会去调用第三个参数里面的invoke方法,那么我们就可以让他真正的调用吃饭方法了
在这里插入图片描述这就是jdk的动态代理,但是这个和静态代理没有什么区别,我们需要做一些改动(需要有反射基础)
在这里插入图片描述到这里应该明白了,此时无论掉用animal里的哪个方法,最终都会调用第三个参数里的invoke方法,但是在调用的时候会传入animal对应方法的Method类和调用时传入的参数,我们就可以根据传过来的数据调用对应的方法,实现动态代理

2.cglib动态代理

cglib是基于子类的代理,画个图说明一下
在这里插入图片描述
很简单的,我们只需要覆盖需要代理的对象,再在基础上做一些扩展就看可以了,展示下静态下cglib方式代理

在这里插入图片描述
在这里插入图片描述
这下应该明白个差不多了,接下来介绍下cglib动态代理的方式

首先需要引入对应jar包,
在这里插入图片描述
接下来我们的ProxyCat就可以创建出来了,需要实现一个方法MethodIntercept
在这里插入图片描述
几乎上和jdk的一模一样,参数分别是
调用的对象,
父类方法,
方法参数,
代理子类方法

不一样的是主方法调用的区别
在这里插入图片描述
这里需要创建一个Enhancer对象,然后设置
代理类superclass
子类实现的对象,callback
然后直接create就行了

3.cglib和jdk动态代理的区别

1.cgllib是针对拥有接口的类,而jdk的是针对任何类
2.cglib是基于字节码,jdk是基于反射
3.jdk效率在jdk1.6,1.7,1.8逐渐升级,原本效率低于cglib,但现在已经和cglib差不多了,甚至要优于cglib

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值