在日常的开发中,Spring AOP 是一个非常常用的功能。谈到 AOP,自然离不开动态代理。
那么,基于 JDK 和 CGLib 如何实现动态代理,他们之间的区别和适用场景是什么呢?接下来,我们一起来探讨一下这个问题。
JDK 如何实现动态代理?
话不多说,我们直接对照着代码来查看。
代码示例
Hello 接口
public interface HelloInterface {
/**
* 代理的目标方法
*/
void sayHello();
/**
* 未被代理处理的方法
*/
void noProxyMethod();
}
Hello 实现类
public class HelloImpl implements HelloInterface {
@Override
public void sayHello() {
System.out.println("proxyMethod:sayHello");
}
@Override
public void noProxyMethod() {
System.out.println("noProxyMethod");
}
}
MyInvocationHandler 实现 InvocationHandler 接口类
public class MyInvocationHandler implements InvocationHandler {
/**
* 目标对象
*/
private Object target;
/**
* 构造方法
*
* @param target
*/
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
if ("sayHello".equals(methodName)) {
// 比方说,mybaitis 中的 PooledConnection 利用 jdk 动态代理重新实现了 close 方法
System.out.println("change method");
return null;
}
System.out.println("invoke method");
Object result = method.invoke(target, args);