动态代理的概念
在业务中使用动态代理,一般是为了给需要实现的方法添加预处理或者添加后续操作,但是不干预实现类的正常业务,把一些基本业务和主要的业务逻辑分离。我们一般所熟知的Spring的AOP原理就是基于动态代理实现的。
动态代理的实现
动态代理有两种实现方式:
一种是JDK自身的动态代理,是利用反射API实现的,在生成类上比较高效;
另一种是CGLIB动态代理,是利用的ASM框架对字节码编译的,运行效率较高。
(1)JDK动态代理实现AOP
步骤:
(1)创建接口类;
(2)创建实现类;
(3)创建代理类——proxy
(4)代理的调用
package Test01;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class test02 {
public static void main(String[] args) {
test test = new testImp();
InvocationHandler testProxy = new testProxy(test);
test proxyInstance = (test) Proxy.newProxyInstance(testProxy.getClass().getClassLoader(), test.getClass().getInterfaces(), testProxy);
proxyInstance.hello("您真6");
}
}
/**
* 1、定义接口类
* @author Linlin Zhao
*
*/
interface test{
public abstract void hello(String content);
}
/**
* 2、定义实现类
* @author Linlin Zhao
*
*/
class testImp implements test{
@Override
public void hello(String content) {
System.out.println("6666666666666"+"-----"+content);
}
}
/**
* 3、创建代理类
* @author Linlin Zhao
*
*/
class testProxy implements InvocationHandler{
private test test;
public testProxy(test test) {
this.test = test;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("begin*************");
Object invoke=method.invoke(test, args);
System.out.println("end*************");
return invoke;
}
}
(2)CGLIB动态代理实现AOP
需要引入cglib的jar包。
CGLIB动态代理实现AOP,使用ASM框架直接对字节码进行操作,可以生成目标类的子类去完成一个代理的功能。
(3)两者对比
(1)JDK动态代理(要求必须有接口)只能够对接口进行代理,不能对普通的类进行代理;CGLIB(要求必须有继承)能够代理普通类;
(2)JDK动态代理使用Java原生的反射API进行操作,在生成类上比较高效;CGLIB使用ASM框架直接对字节码进行操作,在类的执行过程中比较高效。