什么是代理模式?一般用在什么场景?

面试

代理模式是一种结构型设计模式,核心思想是在不改变原始对象的前提下,通过一个代理对象来控制对原始对象的访问,可以在调用前后加点料,比如权限校验、日志记录、缓存等。

这个模式在业务开发中太常见了。Spring AOP 就是基于动态代理实现的,你写的 @Transactional@Async@Cacheable 这些注解能生效,底层都是代理在干活。RPC 框架也是靠动态代理,让调用远程方法跟调本地方法一样丝滑,Dubbo、gRPC 都是这个套路。

代理模式的结构很简单:客户端不直接调真实对象,而是调代理对象,代理对象内部持有真实对象的引用,在调用真实对象方法前后可以插入额外逻辑。

代理模式主要用在这几个场景:

  1. 访问控制:调方法前先检查权限,没权限直接拦住
  2. 延迟加载:真实对象创建成本高,用代理先顶着,真正用到时才初始化
  3. 远程代理:把网络通信细节封装在代理里,客户端以为在调本地方法
  4. 日志监控:统一在代理层记录方法调用耗时、参数、异常,不用每个方法都加代码
java 复制代码
// 接口
interface UserService {
    void save(User user);
}

// 真实对象
class UserServiceImpl implements UserService {
    public void save(User user) {
        System.out.println("保存用户: " + user.getName());
    }
}

// 代理对象:加了日志和耗时统计
class UserServiceProxy implements UserService {
    private UserService target;

    public UserServiceProxy(UserService target) {
        this.target = target;
    }

    public void save(User user) {
        long start = System.currentTimeMillis();
        System.out.println("开始调用 save 方法");
        target.save(user);  // 调真实对象
        System.out.println("调用结束,耗时: " + (System.currentTimeMillis() - start) + "ms");
    }
}
相关推荐
海鸥-w1 分钟前
spingboot定义一个全局异常处理器
java
曹牧12 分钟前
Jackson 反序列化字段名不匹配
java
名字还没想好☜27 分钟前
Spring Boot 优雅停机实战:等在途请求处理完再退出,配合 K8s preStop 别丢请求
java·后端·spring
摇滚侠32 分钟前
《Spring Boot 3:高级与架构设计》第 1 章 Bean 与 BeanDefinition 个人理解 2
java·spring boot·笔记·后端
qq_2695067534 分钟前
第30课-请求与响应
java
qq_269506751 小时前
第28课-AJAX与前端框架
java
程序员清风1 小时前
Java 后端如何接入大语言模型
java·spring boot·架构·aigc
xieliyu.1 小时前
JVM 垃圾回收机制详解:从标记过程、回收算法到垃圾收集器
java·jvm·笔记·java-ee
JavacKaka1 小时前
Redis大Key导致生产事故复盘博客-2026-09-18
java
Sirens.1 小时前
MySQL数据库:JDBC编程
数据库·mysql