spring动态代理 jdk
时间: 2025-01-02 20:39:21 浏览: 8
### Spring Framework 中基于 JDK 的动态代理机制
在 Spring 框架中,当配置 AOP 或者事务管理等功能时,Spring 使用代理模式来增强目标对象的功能。对于实现了接口的目标对象,默认情况下 Spring 会选择使用 JDK 动态代理[^2]。
#### 创建 JDK 动态代理实例
为了创建一个 JDK 动态代理实例,通常需要实现 `InvocationHandler` 接口并重写其方法:
```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
private final Object target; // 被代理的对象
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before calling " + method.getName());
// 执行实际的方法调用
Object result = method.invoke(target, args);
System.out.println("After calling " + method.getName());
return result;
}
}
```
接着可以利用 `Proxy.newProxyInstance()` 方法生成代理对象:
```java
import java.lang.reflect.Proxy;
// 假设有一个名为 ServiceInterface 的接口以及其实现类ServiceImpl
ServiceInterface serviceImpl = new ServiceImpl();
MyInvocationHandler handler = new MyInvocationHandler(serviceImpl);
Class<?>[] interfaces = { ServiceInterface.class };
ServiceInterface proxyInstance = (ServiceInterface) Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
interfaces,
handler
);
```
上述代码展示了如何通过自定义的 `InvocationHandler` 来拦截对指定接口的所有方法调用,在执行前后打印日志信息作为例子说明。
需要注意的是,如果应用程序中的 bean 实际上是由 CGLIB 代理而非 JDK 动态代理,则直接调用 `getClass()` 可能不会返回原始类型的 Class 对象,而是返回由 CGLIB 生成的一个子类的 Class 对象[^3]。
阅读全文