通过可插拔中间件设计,降低替换与升级成本。
JDK 动态代理平台
JDK 动态代理是一种机制,允许在运行时动态创建类的代理。它通过创建动态生成的代理类来实现,该类实现了被代理类的接口。该代理类可以拦截对被代理方法的调用,并执行自定义逻辑。
工作原理:
JDK 动态代理的工作原理如下:
创建 InvocationHandler: 创建一个 InvocationHandler 类,该类将负责在代理方法被调用时拦截并执行自定义逻辑。
生成代理类: 使用 java.lang.reflect.Proxy 类通过 InvocationHandler 动态生成代理类。代理类实现了被代理类的接口。
实例化代理类: 创建代理类的实例。
4. 调用代理方法: 代理类可以像被代理类一样被调用。但是,当代理方法被调用时,InvocationHandler 的 invoke() 方法会被调用。
5. 处理方法调用: 在 invoke() 方法中,InvocationHandler 可以根据需要拦截方法调用、修改参数、增强结果或抛出异常。
优点:
灵活性: 允许在运行时动态创建代理,这提供了极大的灵活性。
可重用性: InvocationHandler 可以被多个代理类重用,减少代码重复。
缺点:
性能开销: 动态代理可能会引入一些性能开销,因为需要动态生成代理类。
有限性: 仅限于实现接口的类。
使用案例:
JDK 动态代理用于各种场景,包括:
日志记录: 拦截方法调用并记录调用信息。
性能监控: 拦截方法调用并收集有关方法执行时间和资源使用的数据。
事务管理: 拦截方法调用并确保对数据库的更改要么全部成功,要么全部失败。
安全: 拦截方法调用并检查用户权限。
示例:
```java
// 被代理的接口
interface Foo {
void doSomething();
}
// InvocationHandler 实现
class MyInvocationHandler implements InvocationHandler {
private Foo target;
public MyInvocationHandler(Foo target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在方法调用之前执行自定义逻辑

System.out.println("Before method call");
// 调用原始方法
Object result = method.invoke(target, args);
// 在方法调用之后执行自定义逻辑
System.out.println("After method call");
return result;
}
}
// 创建代理
Foo proxy = (Foo) Proxy.newProxyInstance(
Foo.class.getClassLoader(),
new Class[] { Foo.class },
new MyInvocationHandler(new FooImpl())
);
// 调用代理方法
proxy.doSomething();
```