spring的动态代理怎么实现
时间: 2024-10-20 11:10:39 浏览: 27
Spring框架的动态代理主要通过AOP(Aspect Oriented Programming,面向切面编程)中的`org.springframework.aop.framework.ProxyFactoryBean`和`java.lang.reflect.Proxy`两个工具来实现。这两个工具允许你在运行时创建一个新的代理类,该代理类会拦截并增强原始的目标对象的行为。
**1. `ProxyFactoryBean`实现**:
`ProxyFactoryBean`是Spring提供的一个工厂bean,用于创建动态代理对象。你可以配置它来代理特定的接口或目标对象,并可以自定义切点、通知(before, after, around等)、拦截器链等。当你调用`getTarget()`方法获取代理实例时,Spring会在后台生成一个新的代理类。
```java
// 创建代理工厂
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(targetObject); // 需要代理的对象
// 添加切面或者通知
Advisor advisor = ...; // 定义切面规则
proxyFactory.addAdvisor(advisor);
// 获取代理对象
MyInterface myProxy = (MyInterface) proxyFactory.getProxy();
```
**2. `java.lang.reflect.Proxy`实现**:
这是Java语言内置的动态代理机制,Spring也支持使用这个API。你需要手动创建InvocationHandler接口的实现,然后使用`Proxy.newProxyInstance`方法创建代理。
```java
// 创建InvocationHandler
InvocationHandler handler = new MyInvocationHandler(originalObject);
// 使用反射创建代理
MyInterface myProxy = (MyInterface) Proxy.newProxyInstance(
MyInterface.class.getClassLoader(),
new Class[]{MyInterface.class},
handler);
```
在这里,`MyInvocationHandler`会对方法调用进行拦截和处理。
阅读全文