首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Spring AOP】代理模式的定义,静态代理的实现

【Spring AOP】代理模式的定义,静态代理的实现

作者头像
椰椰椰耶
发布2025-07-21 09:05:40
发布2025-07-21 09:05:40
8800
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

代理模式

前面我们学习了 Spring AOP 的应用,接下来我们看看 Spring 是如何实现 AOP

Spring AOP 是基于动态代理来实现 AOP 的,我们主要学习:

  1. 代理模式
  2. Spring AOP 源码剖析

定义

代理模式,也叫委托模式

定义:为其他对象提供一种代理以控制对这个对象的访问。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用

在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用


使用代理前:

image.png|436
image.png|436

使用代理后:

image.png|421
image.png|421

生活中的代理

  • 艺人经纪人:广告商照艺人拍广告,需要经过经纪人,由经纪人来和艺人进行沟通
  • 房屋中介:房屋进行租赁时,卖方会把房屋授权给中介,由中介来代理看房,房屋咨询等服务

代理模式的主要角色

  • Subject:业务接口类。可以是抽象类或者接口(不一定有)
  • RealSubject:业务实现类。具体的业务执行,也就是被代理对象
  • Proxy:代理类。RealSubject 的代理

比如房屋租赁

  • Subject 就是提前定义了房东做的事情,交给中介代理,也是中介要做的事情
  • RealSubject:房东
  • Proxy:中介

UML 类图如下:

image.png|480
image.png|480

代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强

根据代理的创建时期,代理模式分为静态代理动态代理

  • 静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译,在程序运行前代理类的 .class 文件就已经存在了
    • 去买房,每个房型有不同的中介配置,去了就是那个中介带你
  • 动态代理:在程序运行时,运用反射机制动态创建而成
    • 去买房,去了之后,动态给你分配中介,带你去看房

静态代理

静态代理:在程序运行前,代理类的 .class 文件就已经存在了(在出租房子前,中介已经做好了相关的工作,就等租户来租房子了)

我们通过代码来加深理解。以房屋租赁为例

例子

我们通过代码来加深理解。以房屋租赁为例

  1. 定义接口(定义房东要做的事情,也是中介需要做的事情)
代码语言:javascript
代码运行次数:0
运行
复制
public interface HouseSubject {  
    void rentHouse();  
}
  1. 实现接口(房东出租房子)
代码语言:javascript
代码运行次数:0
运行
复制
public class RealHouseSubject implements HouseSubject{  
    @Override  
    public void rentHouse() {  
        System.out.println("我是房东,我出租房子!");  
    }  
}
  1. 代理(中介,帮房东出租房子)
代码语言:javascript
代码运行次数:0
运行
复制
public class HouseProxy implements HouseSubject{  
    // 将被代理对象声明为成员变量  
    private HouseSubject houseSubject;  
  
    public HouseProxy(HouseSubject houseSubject) {  
        this.houseSubject = houseSubject;  
    }  
  
    @Override  
    public void rentHouse() {  
        // 开始代理  
        System.out.println("我是中介,开始代理");  
        // 代理房东出租房子  
        houseSubject.rentHouse();  
        // 代理结束  
        System.out.println("我是中介,代理结束");  
    }  
}
  1. 使用
代码语言:javascript
代码运行次数:0
运行
复制
public class StaticMain {  
    public static void main(String[] args) {  
        HouseSubject subject = new RealHouseSubject();  
        // 创建代理类  
        HouseProxy proxy = new HouseProxy(subject);  
        // 通过代理类访问目标方法  
        proxy.rentHouse();  
    }  
}

运行结果:

image.png|339
image.png|339

上面这个代理实现方式就是静态代理(仿佛什么也没干)

从上述程序可以看出,虽然静态代理也完成了对目标对象的代理,但是由于代码都写死了,对目标对象的每个方法的增强都是手动完成的,非常不灵活。所以日常开发几乎看不到静态代理的场景


接下来新增需求:中介又新增了其他业务:代理房屋出售

  • 我们需要对上述代码进行修改
  1. 接口定义修改
代码语言:javascript
代码运行次数:0
运行
复制
public interface HouseSubject {  
    void rentHouse();  
  
    void saleHouse();  
}
  1. 接口实现修改
代码语言:javascript
代码运行次数:0
运行
复制
public class RealHouseSubject implements HouseSubject{  
    @Override  
    public void rentHouse() {  
        System.out.println("我是房东,我出租房子!");  
    }  
  
    @Override  
    public void saleHouse() {  
        System.out.println("我是房东,我要出售房子");  
    }  
}
  1. 代理类修改
代码语言:javascript
代码运行次数:0
运行
复制
public class HouseProxy implements HouseSubject{  
    // 将被代理对象声明为成员变量  
    private HouseSubject houseSubject;  
  
    public HouseProxy(HouseSubject houseSubject) {  
        this.houseSubject = houseSubject;  
    }  
  
    @Override  
    public void rentHouse() {  
        // 开始代理  
        System.out.println("我是中介,开始代理");  
        // 代理房东出租房子  
        houseSubject.rentHouse();  
        // 代理结束  
        System.out.println("我是中介,代理结束");  
    }  
  
    @Override  
    public void saleHouse() {  
        // 开始代理  
        System.out.println("我是中介,开始代理");  
        // 代理房东出租房子  
        houseSubject.saleHouse();  
        // 代理结束  
        System.out.println("我是中介,代理结束");  
    }  
}

从上述代码可以看出,我们修改接口(Subject)和业务实现类(RealSubject)时,还需要修改代理类(Proxy

同样的,如果有新增接口(Subject)和业务实现类(RealSubject),也需要对每一个业务实现类新增代理类(Proxy


既然代理的流程是一样的,有没有一种办法,让他们能通过一个代理类来实现呢?

  • 这里就需要用到动态代理技术了
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代理模式
  • 定义
  • 静态代理
    • 例子
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档