通过案例理解Spring中静态代理

 更新时间:2025年12月09日 14:15:47   作者:qq_54867493  
文章介绍了静态代理和动态代理的概念,通过中介租房案例展示了代理模式的实现,静态代理中,每个真实对象都有一个对应的代理类,这种方式在真实对象较多时会显得繁琐,动态代理则通过代理工具类来处理,避免了为每个真实对象编写代理类的问题,感兴趣的朋友跟随小编一起看看吧

参考https://www.jb51.net/program/3545702mr.htm

无论是静态代理还是动态代理,都有四大角色:

  1. 抽象角色:一般会使用接口或者抽象类来解决
  2. 真实角色:被代理的角色
  3. 代理角色:代理真实角色,一般会做一些附属操作
  4. 客户:访问代理对象的人

中介租房案例

首先,定义一个接口(Rent),房东类(Host)实现该接口,并输出自己房子的相关信息。

//租房
public interface Rent {
    public  void rent();
}
//房东
public class Host implements Rent{
    public void rent() {
        System.out.println("我的房子是蓝色的,准备出租房子!");
    }
}

房东将房子交给中介,此时的中介相当于代理类(Proxy)

代理类在不修改被代理对象功能 (Host类的rent方法) 的基础上,可以对代理类进行扩展(增加seeHouse、fare方法)

public class Proxy implements Rent{
    private Host host;
    public Proxy(){ }
    public Proxy(Host host){
        this.host=host;
    }
    public void rent() {
        seeHouse();
        host.rent();
        fare();
    }
    //看房
    public void seeHouse(){
        System.out.println("中介带你看房子");
    }
    }
    //收费
    public void fare(){
        System.out.println("收中介费");
    }
}

客户购房不用面对房东,只需与中介对接。

public class Client {
    public static void main(String[] args) {
        Host host=new Host(); //房东要出租房子
        //代理,中介帮房东租房子,但是代理角色一般会有一些附属操作
        Proxy proxy=new Proxy(host);
        //客户不用面对房东,直接找中介租房即可
        proxy.rent();
    }
}

上述代码就实现了静态代理,客户只需面向代理类操作即可。

运行截图

缺点:静态代理中,每个真实对象都会拥有一个代理类,这样将会十分繁琐。

如果采用静态代理,当有100个房东时,我们将要编写100个代理类,这种处理方法明显不妥。因此我们可以使用动态代理,编写一个代理工具类,该类并未指明代理的真实对象是哪一个。

public class DynamicProxy {
    public static Object getProxyInstance(Object target){
        return Proxy.newProxyInstance(
            target.getClass().getClassLoader(),
            target.getClass().getInterfaces(),
            (proxy, method, args)->{
                Object result = method.invoke(target,args);
                return result;
            }
        );
    }
}
public class Client {
    public static void main(String[] args) {
        Rent proxyInstance1 = (Rent) DynamicProxy.getProxyInstance(
                new Host1());
        proxyInstance1.rent();
        Rent proxyInstance2 = (Rent)DynamicProxy.getProxyInstance(
                new Host2());
        proxyInstance2.rent();
    }
}

到此这篇关于通过案例理解Spring中静态代理的文章就介绍到这了,更多相关Spring静态代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java中的封装、继承、多态

    详解Java中的封装、继承、多态

    本文主要介绍了Java中的封装、继承、多态的相关知识,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • SpringBoot中二级缓存实现方案总结

    SpringBoot中二级缓存实现方案总结

    随着业务的发展,单一的缓存方案往往无法同时兼顾性能、可靠性和一致性等多方面需求,此时,二级缓存架构应运而生,本文将介绍在Spring Boot中实现二级缓存的三种方案,大家可以根据需要进行选择
    2025-06-06
  • Event Sourcing事件溯源模式优化业务系统

    Event Sourcing事件溯源模式优化业务系统

    这篇文章主要为大家介绍了Event Sourcing事件溯源模式优化业务系统示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • IDEA 隐藏DEBUG日志的解决方法

    IDEA 隐藏DEBUG日志的解决方法

    IDEA 打印太多的DEBUG日志,看起来很烦,有没有办法隐藏日志,网上找了一圈,没有谁写的靠谱的,下面小编给大家分享下IDEA 如何隐藏DEBUG日志,需要的朋友可以参考下
    2022-09-09
  • java中静态代码块与构造方法的执行顺序判断

    java中静态代码块与构造方法的执行顺序判断

    对静态代码块以及构造函数的执行先后顺序,一直很迷惑,直到最近看到一段代码,发现终于弄懂了,所以这篇文章主要给大家介绍了关于如何判断java中静态代码块与构造方法的执行顺序的相关资料,需要的朋友可以参考下。
    2017-12-12
  • Java数组转换为List的四种方式

    Java数组转换为List的四种方式

    这篇文章主要介绍了Java开发技巧数组转List的四种方式总结,每种方式结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Mybatis中的缓存机制解析

    Mybatis中的缓存机制解析

    这篇文章给大家介绍mybatis中的缓存机制,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • 在java的Map集合中,如何更改value的值

    在java的Map集合中,如何更改value的值

    这篇文章主要介绍了在java的Map集合中,如何更改value的值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java中的图形界面重绘方式

    Java中的图形界面重绘方式

    这篇文章主要介绍了Java中的图形界面重绘方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • SpringMvc直接接收json数据自动转化为Map的实例

    SpringMvc直接接收json数据自动转化为Map的实例

    今天小编就为大家分享一篇SpringMvc直接接收json数据自动转化为Map的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08

最新评论