spring复习:(38)ProxyFactoryBean中使用jdk动态代理生成代理对象时,业务方法调用时的执行流程
发布人:shili8
发布时间:2025-01-10 19:10
阅读次数:0
**Spring代理机制深入浅出**
在 Spring 框架中,代理机制是实现 AOP(面向切面编程)的关键技术之一。ProxyFactoryBean 是一个用于生成代理对象的工厂类,它可以使用 JDK 动态代理或 CGLIB 来生成代理对象。在本文中,我们将重点讨论 ProxyFactoryBean 中使用 JDK 动态代理生成代理对象时,业务方法调用时的执行流程。
**JDK 动态代理**
JDK 动态代理是 Java 提供的一种代理机制,它允许在运行时动态地创建代理类和实例。下面是一个简单的示例:
java//代理接口public interface Hello {
void sayHello();
}
// JDK 动态代理类public class HelloProxy implements InvocationHandler {
private Object target;
public HelloProxy(Object target) {
this.target = target;
}
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before " + method.getName());
Object result = method.invoke(target, args);
System.out.println("After " + method.getName());
return result;
}
}
// 使用 JDK 动态代理生成代理对象public class Main {
public static void main(String[] args) {
Hello hello = (Hello) Proxy.newProxyInstance(
Main.class.getClassLoader(),
new Class[]{Hello.class},
new HelloProxy(new HelloImpl())
);
hello.sayHello();
}
}
// 被代理类public class HelloImpl implements Hello {
@Override public void sayHello() {
System.out.println("Hello, World!");
}
}
在上面的示例中,我们定义了一个 `Hello` 接口,一个 `HelloProxy` 类实现了 `InvocationHandler` 接口,这个接口提供了一个 `invoke` 方法来处理代理类的方法调用。在 `Main` 类中,我们使用 `Proxy.newProxyInstance` 方法生成了一个代理对象,并将其赋值给 `hello` 变量。最后,我们通过 `hello.sayHello()` 来调用被代理类的 `sayHello` 方法。
**ProxyFactoryBean**
现在我们来看一下 ProxyFactoryBean 的源码:
javapublic class ProxyFactoryBean extends FactoryBean implements BeanNameAware, InitializingBean {
// ...
}
ProxyFactoryBean 是一个工厂类,它可以生成代理对象。下面是使用 JDK 动态代理生成代理对象时,业务方法调用时的执行流程:
1. 首先,我们需要创建一个 `ProxyFactoryBean` 的实例,并将其配置为使用 JDK 动态代理。
2. 当我们通过 `ProxyFactoryBean` 来获取代理对象时,它会自动地创建一个代理类和实例。
3. 当我们调用代理对象的方法时,JDK 动态代理机制会捕捉这个方法调用,并将其转发给被代理类的相应方法。
4. 被代理类的方法执行完毕后,JDK 动态代理机制会再次捕捉这个方法调用,并将其转发回原始的方法调用者。
下面是一个使用 ProxyFactoryBean 的示例:
java// 使用 ProxyFactoryBean生成代理对象public class Main {
public static void main(String[] args) {
BeanNameAware bean = new MyBean();
FactoryBean factory = new ProxyFactoryBean(bean);
Object proxy = factory.getObject();
((MyInterface)proxy).myMethod();
}
}
// 被代理类public class MyBean implements MyInterface {
@Override public void myMethod() {
System.out.println("Hello, World!");
}
}
在上面的示例中,我们使用 ProxyFactoryBean 来生成一个代理对象,并将其赋值给 `proxy` 变量。最后,我们通过 `((MyInterface)proxy).myMethod()` 来调用被代理类的 `myMethod` 方法。
**总结**
本文主要讨论了 Spring 框架中的 ProxyFactoryBean 和 JDK 动态代理机制。在使用 JDK 动态代理生成代理对象时,业务方法调用时的执行流程如下:
1. 首先,我们需要创建一个 `ProxyFactoryBean` 的实例,并将其配置为使用 JDK 动态代理。
2. 当我们通过 `ProxyFactoryBean` 来获取代理对象时,它会自动地创建一个代理类和实例。
3. 当我们调用代理对象的方法时,JDK 动态代理机制会捕捉这个方法调用,并将其转发给被代理类的相应方法。
4. 被代理类的方法执行完毕后,JDK 动态代理机制会再次捕捉这个方法调用,并将其转发回原始的方法调用者。
通过理解 ProxyFactoryBean 和 JDK 动态代理机制,我们可以更好地利用 Spring 框架来实现 AOP。

