理解名词
代理模式(Proxy Design Pattern)是一种结构型设计模式,代理在这里理解为代替原始类与外界进行交互(接收请求返回结果)
作用
在不改变原始类(被代理类)代码的情况下,通过引入代理类来给原始类附加功能。
应用场景
- 非功能性需求,比如:监控、统计、鉴权、限流、事务、幂等、日志。
- RPC、缓存
代码示例
实现一个方法调用耗时统计的功能
public class MetricsCollectorProxy {
public Object createProxy(Object proxiedObject) {
Class<?>[] interfaces = proxiedObject.getClass().getInterfaces();
DynamicProxyHandler handler = new DynamicProxyHandler(proxiedObject);
return Proxy.newProxyInstance(proxiedObject.getClass().getClassLoader(), interfaces, handler);
}
private class DynamicProxyHandler implements InvocationHandler {
private Object proxiedObject;
public DynamicProxyHandler(Object proxiedObject) {
this.proxiedObject = proxiedObject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long startTimestamp = System.currentTimeMillis();
Object result = method.invoke(proxiedObject, args);
long endTimeStamp = System.currentTimeMillis();
long responseTime = endTimeStamp - startTimestamp;
String apiName = proxiedObject.getClass().getName() + ":" + method.getName();
// 打印或上报apiName,responseTime...
return result;
}
}
}
使用示例
MetricsCollectorProxy proxy = new MetricsCollectorProxy();
IUserController userController = (IUserController) proxy.createProxy(new UserController());
业界经典实现
- Spring AOP