理解Spring中静态代理

news2024/10/7 15:50:06

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

无论是静态代理还是动态代理,都有四大角色:
  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();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2194450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ultralytics yolo pose 示例:加载官方pose模型进行推理

Ultralytics YOLO 是计算机视觉和 ML 领域专业人士的高效工具。 安装 ultralytics 库: pip install ultralytics 官方YoLo Pose 模型列表信息: 实现代码如下: from ultralytics import YOLO import cv2 # Load a model ckpt_dir "…

基于PHP的校园二手书交易管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的校园二手书交易管理系统 一 介绍 此二手书交易管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈:phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注…

3. BBP系列运动控制板(飞控板)简介

3.1. 概述 Bread Board Pilot(简称BBP) 是在积累了前期 Single Pilot 及 PH7 飞控板大量设计及使用经验的基础上,全新基于PH47代码框架开发的高灵活性, 高性能, 超低成本的最新一代飞控板设计。 目前,因为其使用便捷灵活&#xf…

D30【python 接口自动化学习】- python基础之输入输出与文件操作

day30 F-strings输出 学习日期:20241007 学习目标:输入输出与文件操作﹣-42 F-strings-如何通过定义好的格式进行输出? 学习笔记: F-strings 介绍 F-strings 的计算功能 F-strings 宽度和精度调整 练习 # 宽度为10个…

【计算机网络 - 基础问题】每日 3 题(二十九)

✍个人博客:https://blog.csdn.net/Newin2020?typeblog 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞…

platformio.ini工程配置文件入门

主要参考资料: “platformio.ini” (Project Configuration File): https://docs.platformio.org/en/latest/projectconf/index.html 目录 简介语法[platformio]: PlatformIO配置选项[env]:配置环境 简介 .ini是一个配置文件,它可以设置开发环境&#x…

4.循环结构在存储过程中的应用(4/10)

引言 在数据库管理中,存储过程是一种强大的工具,它允许将一组SQL语句封装为一个独立的、可重用的单元。存储过程不仅可以提高数据处理的效率,还可以增强代码的安全性和可维护性。在复杂的数据库操作中,循环结构扮演着至关重要的角…

面试系列-淘天提前批面试

00-淘天提前批面试 在牛客上看到了淘天提前批的面试题目,这里分析一下淘天面试的问了有哪些内容,面试的重点 是偏向哪些方面 项目相关 1、秒杀架构如何设计? 问了秒杀的架构如何设计,对于秒杀的设计,秒杀符合 写多读少…

【cpp/c++ summary 工具】Visual Studio 2022 安装与cmake项目配置

Visual Studio 2022安装 https://visualstudio.microsoft.com/zh-hans/free-developer-offers/下载后选择c桌面开发安装即可: Visual Studio 2022创建cmake项目 Visual Studio 2022打开cmake项目 点击打开带有cmakelists.txt的项目文件夹 配置缓存:点…

【操作系统考研】2进程管理(1)

在翻看操作系统知识框架的时候,对一些概念的理解还比较模糊,现在我来理清他们的关系。 操作系统、处理器、进程、线程、内存、存储器、设备、文件的关系 咱们可以把计算机系统想象成一个大工厂,来理解这些概念之间的关系。 操作系统&#xf…

小目标检测利器:YOLOv8+SAHI使用教程

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

软考系统分析师知识点三:应用数学

前言 今年报考了11月份的软考高级:系统分析师。 考试时间为:11月9日。 倒计时:34天。 目标:优先应试,其次学习,再次实践。 复习计划第一阶段:扫平基础知识点,仅抽取有用信息&am…

vSAN06:ESA与OSA对比、ESA安装、新架构、工作方式、自动策略管理、原生快照、数据压缩、故障处理

目录 vSAN ESAvSAN ESA 安装ESA新架构ESA工作方式ESA自动策略管理自适应RAID5策略 原生快照支持数据压缩的改进ESA故障处理 vSAN ESA vSAN ESA 安装 流程和OSA完全一致,但要注意要勾选启用vSAN ESA ESA和OSA的底层架构不一样,但是UI上是一致的。 生产环…

【C++】第二节:类与对象(上)

1、面向过程和面向对象初步认识 C 语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C 是面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 …

【ESP32】Arduino开发 | Timer定时器+定时器闹钟例程

有关定时器外设的详细介绍在ESP-IDF的对应文章中,跳转栏目目录可以找到。 1. API 1.1 启动定时器 hw_timer_t * timerBegin(uint8_t timer, uint16_t divider, bool countUp); timer:定时器序号(ESP32有4个硬件定时器,所以可填序…

您看这篇就够了:ComfyUI 新手指南!

前言 欢迎来到 ComfyUI 的神奇世界,这是 Stable Diffusion 的一个强大而灵活的图形用户界面。无论你是数字艺术的新手,还是希望将你的图像创作提升到新高度的老手,ComfyUI 都能满足你的需求。在这篇全面的指南中,我们将带你穿越 …

2003经典绝版100%仿盛大服务端火炬引擎原版

;中国游戏制作 本版本为中国游戏制作小组推出的第一个版本,有什么不完美的地方还请大家多多指教!!! 与盛大逼真!!! 本版本M2Server采用“梦幻风”以及“冰眼”M2Server修改器修改的 2004/1/…

vue项目配置cesium

vue中配置cesium ①打开目标文件夹的终端,输入 pnpm install cesium ②这时你的node_models文件夹下,会出现cesium文件夹;然后,其中Build/Cesium文件夹,复制到public文件夹下。 ③打开public/index.html文件&#xf…

Linux下载安装MySQL8.4

这里写目录标题 一、准备工作查看系统环境查看系统架构卸载已安装的版本 二、下载MySQL安装包官网地址 三、安装过程上传到服务器目录解压缩,设置目录及权限配置my.cnf文件初始化数据库配置MySQL开放端口 一、准备工作 查看系统环境 确认Linux系统的版本和架构&am…

[单master节点k8s部署]31.ceph分布式存储(二)

Ceph配置 Ceph集群通常是一个独立的存储集群,可以部署在 Kubernetes 集群之外。Ceph 提供分布式存储服务,能够通过 RADOS、CephFS、RBD(块存储)、和 RGW(对象存储)等方式与 Kubernetes 集成。即使 Ceph 部…