关于代理设计模式,很多时候都是使用这种机制针对特定的对象进行增强,说白了就是在目标方法执行前后执行我们新添加的逻辑,达到增强的目的
尤其是Spring中,我们通过
@Configration
注解把对象的创建权反转给spring,当我们再问spring索要对象的时候,返回给我们的其实是被cglib代理过的对象,而且AOP底层大规模使用cglib字节码代理生成技术:
真想把SpringAOP整的明明白白,想从底层去一行一行看Spring的代理,一定会疯掉!!! 随便打开一个类,就能看他有父类,父类还有父类,爷爷更变态,不仅有父亲还有接口, 我们知道,对象的创建是会调用父亲的构造方法的,这些东西全得看,不疯? 才怪,整的我都想以头抢地了
好,言归正传,重点认识cglib,基于字节码的动态代理技术的使用
- 虚拟代理:
虚拟代理是 被代理对象的替身,真正的对象在创建前和创建中时,由虚拟代理替代他的位置,比如:我们用手机浏览图片,假如网络不好,就会出现一个圈圈在转动,或者一个默认的图片代替目标图片
- 动态代理
- jdk动态代理
- cglib动态代理
区别:
jdk动态代理是是有限制的,就是被代理的类必须实现了接口(然后代理对象也会实现那个接口,两者知根知底,进而有代理增强的可能,我在前几篇博客 反射与动态代理 中有写具体的使用)
cflib,比较灵活,它认被代理的对象为父,从而不管被代理的类是否实现了接口
坐标1
2
3
4
5<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.10</version>
</dependency>
被代理的类
1 | public class MyService { |
代理逻辑
1 | public class MyCglib implements MethodInterceptor { |
测试
1 | public class MyText { |