一、静态代理
- 定义接口和实现类:
public interface UserService {
void addUser(String name);
}
public class UserServiceImpl implements UserService {
@Override
public void addUser(String name) {
System.out.println("添加用户:" + name);
}
}
- 创建代理类(实现相同接口):
public class UserServiceProxy implements UserService {
private UserService target;
public UserServiceProxy(UserService target) {
this.target = target;
}
@Override
public void addUser(String name) {
System.out.println("开始添加用户");
target.addUser(name); // 调用目标方法
System.out.println("添加用户完成");
}
}
- 使用代理:
UserService target = new UserServiceImpl();
UserService proxy = new UserServiceProxy(target);
proxy.addUser("张三"); // 输出增强后的结果
二、JDK动态代理(基于接口)
- 定义接口和实现类:
public interface UserService {
void addUser(String name);
}
public class UserServiceImpl implements UserService {
@Override
public void addUser(String name) {
System.out.println("添加用户:" + name);
}
}
- 实现
InvocationHandler:
import java.lang.reflect.*;
public class LogHandler implements InvocationHandler {
private Object target;
public LogHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法调用前");
Object result = method.invoke(target, args); // 调用目标方法
System.out.println("方法调用后");
return result;
}
}
- 生成代理对象:
UserService target = new UserServiceImpl();//这里用接口还是实现类来接收都行
UserService proxy = (UserService) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(), // 代理的接口
new LogHandler(target)
);
proxy.addUser("李四"); // 输出增强后的结果
如果目标对象实现了多个接口,想使用哪个接口的增强功能,只需要把LogService替换成那个接口就行
LogService proxy = (LogService)Proxy.newProxyInstance(...)
三、CGLIB代理(基于子类)
- 引入cglib依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
- 被代理的类
public class TargetClass {
public void doSomething() {
System.out.println("TargetClass is doing something.");
}
}
- 创建方法拦截器
实现 MethodInterceptor 接口,定义代理逻辑:
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// 前置增强
System.out.println("Before method: " + method.getName());
// 调用原始方法
Object result = proxy.invokeSuper(obj, args);
// 后置增强
System.out.println("After method: " + method.getName());
return result;
}
}
- 生成代理对象
import net.sf.cglib.proxy.Enhancer;
public class CglibDemo {
public static void main(String[] args) {
// 创建增强器
Enhancer enhancer = new Enhancer();
// 设置父类(被代理的类)
enhancer.setSuperclass(TargetClass.class);
// 设置回调(拦截器)
enhancer.setCallback(new MyMethodInterceptor());
// 创建代理对象
TargetClass proxy = (TargetClass) enhancer.create();
// 调用方法
proxy.doSomething();
}
}

513

被折叠的 条评论
为什么被折叠?



