spring中,动态代理的实现方式和例子1
时间: 2024-03-14 22:48:25 浏览: 19
Spring中的AOP实现有两种方式:静态代理和动态代理。动态代理是通过Java反射机制在运行时动态生成代理类,可以代理任意一个实现了接口的类,不需要手动编写代理类。下面是动态代理的实现方式和例子。
首先,定义一个接口Subject,里面有一个方法request:
```java
public interface Subject {
void request();
}
```
然后,定义一个实现类RealSubject,实现Subject接口:
```java
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject Request");
}
}
```
接下来,定义一个InvocationHandler接口的实现类ProxyHandler,其中定义一个Object类型的target成员变量,用于指定代理的目标对象,然后在invoke方法中实现对目标对象方法的代理:
```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler {
private Object target;
public ProxyHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("ProxySubject before request");
Object result = method.invoke(target, args);
System.out.println("ProxySubject after request");
return result;
}
}
```
在ProxyHandler类中,我们在invoke方法调用目标对象的方法前后分别输出一些字符串,以此实现对目标对象的代理。
最后,我们可以在客户端代码中创建RealSubject和动态代理对象,并调用request方法:
```java
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxyHandler proxyHandler = new ProxyHandler(realSubject);
Subject proxySubject = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
proxyHandler);
proxySubject.request();
}
}
```
在客户端代码中,我们创建了一个ProxyHandler对象,并将RealSubject对象传入,然后使用Proxy类的newProxyInstance方法动态生成了一个代理对象proxySubject。最后调用proxySubject的request方法,实现了对RealSubject的代理。
输出结果为:
```
ProxySubject before request
RealSubject Request
ProxySubject after request
```
这就是动态代理的实现方式和例子。需要注意的是,动态代理只能代理实现了接口的类,如果要代理没有实现接口的类,就需要使用cglib等第三方库实现动态代理。