JDK动态代理和CGLIB动态代理总结

静态代理的弊端:

静态代理为每一个目标对象创建一个代理类,目标对象非常多的话显然维护难度会加大;

JDK动态代理:

流程:

1.目标对象必须实现接口

2.代理逻辑的实际处理类一定要实现InvocationHandler(拦截器)接口,在其中的invoke()方法中对目标对象的方法进行增强,

接口代理对象的所有方法都会转发到invoke()方法处理

3.实际处理类中有一个Obeject类型的对象表示目标对象,使这个类得到复用,所有实现了接口的要选择此种增强的方法都可以使用这个实际处理类创建代理对象

4.代理对象使通过java反射机制在运行时通过Proxy.newProxyInstance动态生成的

CGLIB动态代理:

1.CGLIB动态代理不要求目标对象一定要实现接口;

2.代理逻辑的实际处理类要实现MethodInterceptor接口,在intercept()方法中对目标对象的方法进行增强

3.CGLIB通过Enhancer对象指定代理的目标对象,实现处理逻辑的对象,使用create()在运行期间动态得到代理对象;

二者的区别:

1.JDK动态代理要求目标对象一定要实现代理接口,CGLIB则不用

2.JDK动态代理通过反射机制要动态生成代理类,生成生成类的过程比较高效

3.CGLIB基于继承来实现代理,代理对象实际上是目标对象的子类,它内部通过第三方类库ASM,加载目标对象类的class文件,修改字节码来生成子类,生成类的过程较低效,但生成类以后的执行很高效,可以通过将ASM生成的类进行缓存来解决生成类过程低效的问题;

posted @ 2018-03-09 12:46  大熊好好写代码  阅读(224)  评论(0编辑  收藏  举报