理解Spring中静态代理

参考https://blog.csdn.net/weixin_43005654/article/details/109317773

无论是静态代理还是动态代理,都有四大角色:
  1. 抽象角色:一般会使用接口或者抽象类来解决
  2. 真实角色:被代理的角色
  3. 代理角色:代理真实角色,一般会做一些附属操作
  4. 客户:访问代理对象的人

中介租房案例

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

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

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

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

java 复制代码
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("收中介费");
    }
}

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

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

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

运行截图

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

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

java 复制代码
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;
            }
        );
    }
}
java 复制代码
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();
    }
}
相关推荐
virus59457 小时前
悟空CRM mybatis-3.5.3-mapper.dtd错误解决方案
java·开发语言·mybatis
计算机毕设VX:Fegn08958 小时前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
NE_STOP8 小时前
spring6-注解式开发
spring
没差c9 小时前
springboot集成flyway
java·spring boot·后端
三水不滴9 小时前
Redis 过期删除与内存淘汰机制
数据库·经验分享·redis·笔记·后端·缓存
时艰.9 小时前
Java 并发编程之 CAS 与 Atomic 原子操作类
java·开发语言
编程彩机9 小时前
互联网大厂Java面试:从Java SE到大数据场景的技术深度解析
java·大数据·spring boot·面试·spark·java se·互联网大厂
笨蛋不要掉眼泪9 小时前
Spring Boot集成LangChain4j:与大模型对话的极速入门
java·人工智能·后端·spring·langchain
Yvonne爱编码10 小时前
JAVA数据结构 DAY3-List接口
java·开发语言·windows·python
像少年啦飞驰点、11 小时前
零基础入门 Spring Boot:从“Hello World”到可上线微服务的完整学习指南
java·spring boot·微服务·编程入门·后端开发