静态代理&动态代理

代理是一种模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象。如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求。
在这里插入图片描述

静态代理

(1)实现方式:编写一个代理类,实现与目标对象相同的接口,并在代理类内部维护一个目标对象的引用,该目标对象通过构造器传入。在代理对象中调用目标对象相同的方法,并添加前拦截器,后拦截器等业务功能

动态代理

动态代理中所谓的动态,是针对使用java代码实际编写代理类的“静态”而言,它的优势不在于省去了编写代理类那一点工作量(直接获得一个代理对象),而是实现了可以在原始类和接口还未知的时,就确定代理类的代理行为。
CGlib动态动态代理:
链接: link.
链接: link.

JDK动态代理:
在jdk动态代理中,为所传入接口(即委托类实现的接口)中的每一个方法,以及从Object中继承来的equals()、hashCode()、toString()方法都生成了对应的实现,并统一调用了InvocationHander对象的invoke方法,来实现这些方法的内容,各个方法的区别不过是传入的参数和Method对象有所不同而已,所以无论调用动态代理的哪个方法,实际上都是在执行InvocationHandler.invoke()中的代理逻辑。
在jdk动态代理中,会自动生成一个代理类的class文件“$Proxy0.class”,这个代理类实现了委托类相同的接口。大致的生成过其实就是根据Class文件的格式规范去拼装字节码。
(大致过程:jdk自己拼装了一个代理类,这个代理类实现了委托类的接口,代理类中的方法(包括从Object继承来的方法)都统一调用了InvocationHandler对象的invoke方法(在invoke方法通过反射调用了委托方法并进行增强),所以无论调用动态代理的哪个方法,实际是在执行invoke中的逻辑)
链接: link.

对比 link.
JDK动态代理:在InvocationHandler.invoke(Object proxy:代理对象, Method method:本次调用的方法, Object[] args:方法中的参数)方法中调用委托类的方法(通过:Method.invoke(委托对象,args),即通过反射调用委托对象的方法,委托对象需要外部给),并且实现增强。
CGlib动态代理:在MethodInterceptor.incercept(Object o:代理对象, Method method:本次调用的方法, Object[] objects:方法参数, MethodProxy methodProxy:代理方法即在代理类中)方法中调用父类的方法(通过:Object result = methodProxy.invokeSuper(o, objects);),并实现增强。
大致过程:CGLib自己拼装一个代理类,该代理类继承于委托类,代理类中为继承到的方法(包括从Object 继承到的方法)生成两个相关的方法,一个重写父类方法,这个方法中会调用MethodIntercptor.intercept方法,该方法中调用委托方法(注不是通过反射,而是通过调用前缀为CGLIB那个方法,以为在那个方法中调用了父类方法)并进行增强,另个生成的方法带有CGLIB$前缀,在该方法中直接调用父类方法。
CGLib通过ASM动态操作指令生成了被代理类的子类,重写了目标类中所有的非private、非final、非static方法
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值