动态代理的方式及区别
(1)考察目标
考官主要想对JDK动态代理、CGlib动态代理这两种代理进行考核,如两种代理的定义、特点应用等。
(2)题目分析
动态代理:
特点:字节码随用随创建,随用随加载。
作用:不修改源码的基础上,对已有方法增强。
分类:
基于接口的动态代理
基于子类的动态代理
基于接口的动态代理:
要求:被代理类最少实现一个接口
提供者:JDK官方
涉及类:Proxy
创建代理对象的方法:newProxyInstance
方法中的参数:
ClassLoader:类加载器。
负责加载代理对象的字节码。
和被代理对象使用相同的类加载器。
固定写法。
Class[]:字节码数组。
负责让生成的代理对象具有和被代理对象相同的方法。
写什么要看被代理对象是一个接口还是一个实现类。
如果是一个接口:new Class[]{接口}
如果是一个实现类:XXX.getClass().getInterfaces()
固定写法。
InvocationHandler:一个接口,需要我们提供该接口的实现。
作用是用于对方法增强。
增强的代码,谁用谁写。
写的是一个接口的实现类。
通常是一个匿名内部类,但是不绝对。
基于子类的动态代理:
要求:需要导入cglib的坐标。被代理类不能是最终类。(不能被final修饰)
提供者:cglib(第三方)
涉及类:Enhancer
创建代理对象的方法:create
方法中的参数:
Class: 字节码对象。
用于加载代理对象字节码的。
写的是被代理对象的字节码。是固定写法
Callback:如何代理。提供增强代码的。它是个接口,需要自己写实现。
该接口没有方法,需要用它的子接口MethodInterceptor。
(3)应用场景
动态代理的应用场景很多。例如:
1)基于aop思想的方法增强。
2)自定义连接池中,实现Connection的close方法还回池中操作
3)解决全站中文乱码,get和post两种提交方式的。
在get方式需要对以下三个方法增强,用于解决乱码:
String value = getParameter(String name);
String[] value = getParameterValues(String name);
Map map = getParameterMap();
(4)总结
本题主要考察的是
1)动态代理的作用
2)动态代理的特点
3)动态代理的分类
4)两种动态代理的使用要求