在 Java 中,代理(Proxy) 是一种设计模式,用于在不修改目标对象代码的情况下,对其方法进行增强(如日志、事务、权限控制等)。
Java 中的代理主要分为 静态代理 和 动态代理,它们的核心区别如下:
在编译期就手动编写代理类,代理类与目标类实现相同的接口。
interface UserService {
void save();
}
class UserServiceImpl implements UserService {
public void save() {
System.out.println("保存用户");
}
}
class UserServiceProxy implements UserService {
private UserService target;
public UserServiceProxy(UserService target) {
this.target = target;
}
public void save() {
System.out.println("前置增强");
target.save();
System.out.println("后置增强");
}
}
✅ 简单直观
❌ 代理类需手动编写
❌ 接口一变,代理类也要改
❌ 类数量多,维护困难
在运行时动态生成代理类,不需要手写代理类。
Java 中常见两种方式:
import java.lang.reflect.*;
interface UserService {
void save();
}
class UserServiceImpl implements UserService {
public void save() {
System.out.println("保存用户");
}
}
class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
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;
}
}
public class Test {
public static void main(String[] args) {
UserService target = new UserServiceImpl();
UserService proxy = (UserService) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new MyInvocationHandler(target)
);
proxy.save();
}
}
✅ 不需要手写代理类
✅ 一个处理器可代理多个类
✅ 易于扩展和维护
❌ JDK 动态代理只能代理接口
| 对比项 | 静态代理 | 动态代理 |
|---|---|---|
| 代理类生成时机 | 编译期 | 运行期 |
| 是否手写代理类 | 是 | 否 |
| 灵活性 | 低 | 高 |
| 可维护性 | 差 | 好 |
| 实现方式 | 手动实现接口 | 反射 / 字节码 |
| 典型应用 | 简单场景 | Spring AOP |
静态代理是“写死”的,动态代理是“运行时生成”的;动态代理更灵活,是现代框架(如 Spring)的核心基础。
如果你愿意,我也可以帮你画一张对比图或结合 Spring AOP 讲得更深入。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。