一、核心概念:代理模式就像房屋中介

想象你要租一套房子:

  • :租客(业务调用者)
  • 房东:房主(真实业务对象)
  • 中介:代理对象

传统方式(无代理)

租客 → 直接找房东↓
房东处理所有事情:1. 带看房2. 签合同3. 收租金4. 处理维修

问题:房东被各种琐事淹没,无法专注核心业务(管理房屋)

二、代理模式解决方案

租客 → 联系中介(代理)↓
中介处理辅助事务:1. 带看房 2. 签合同 3. 收租金 4. 处理维修 ↓
房东只做核心业务:确认租赁关系 

三、Spring AOP 中的两种代理

1. JDK 动态代理:基于接口的代理

场景:房东有明确的"租赁服务"接口

// 租赁服务接口
public interface RentalService {void signContract();void collectRent();
}// 真实房东(实现接口)
public class Landlord implements RentalService {public void signContract() {System.out.println("房东签署合同");}public void collectRent() {System.out.println("房东收取租金");}
}// 中介(代理)
public class AgencyProxy implements InvocationHandler {private Object target; // 持有房东引用public Object createProxy(Object target) {this.target = target;return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);}public Object invoke(Object proxy, Method method, Object[] args) {// 前置增强:带看房System.out.println("中介带租客看房");// 调用房东方法Object result = method.invoke(target, args);// 后置增强:处理维修System.out.println("中介安排房屋维修");return result;}
}// 租客使用
public class Renter {public static void main(String[] args) {Landlord realLandlord = new Landlord();RentalService proxy = (RentalService) new AgencyProxy().createProxy(realLandlord);proxy.signContract();proxy.collectRent();}
}

输出结果

中介带租客看房
房东签署合同
中介安排房屋维修中介带租客看房
房东收取租金
中介安排房屋维修

2. CGLIB 代理:基于子类的代理

场景:房东没有实现接口

// 房东(无接口)
public class Landlord {public void signContract() {System.out.println("房东签署合同");}public void collectRent() {System.out.println("房东收取租金");}
}// 中介(代理)
public class AgencyInterceptor implements MethodInterceptor {public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) {// 前置增强System.out.println("中介带租客看房");// 调用房东方法Object result = proxy.invokeSuper(obj, args);// 后置增强System.out.println("中介安排房屋维修");return result;}
}// 租客使用
public class Renter {public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(Landlord.class);enhancer.setCallback(new AgencyInterceptor());Landlord proxy = (Landlord) enhancer.create();proxy.signContract();proxy.collectRent();}
}

输出结果:与JDK代理相同

四、Spring AOP 如何选择代理方式?

 

实际场景对比

代理类型比喻场景优势限制
JDK动态代理房东有租赁资质证书(接口)无需额外依赖只能代理接口方法
CGLIB代理房东是个人房东(无证书)可代理普通类无法代理final方法

五、Spring AOP 代理工作流程 

 

六、为什么需要代理模式?

1. 解决核心问题:关注点分离

关注点房东职责中介职责
核心业务确认租赁关系-
辅助事务-带看房/签合同/维修
客户接触-直接面对租客

2. 实际开发中的对应关系

房屋租赁Spring AOP技术实现
房东服务类(如UserService)@Service
中介代理对象Spring容器创建
带看房前置通知@Before
签合同核心方法业务逻辑
处理维修后置通知@After
租赁接口服务接口UserService接口

 

七、实际代码示例

1. 定义切面(中介服务)

@Aspect
@Component
public class AgencyServices {// 带看房服务(前置通知)@Before("execution(* com.example.service.*.*(..))")public void showHouse() {System.out.println("中介带租客看房");}// 处理维修(后置通知)@After("execution(* com.example.service.*.*(..))")public void handleMaintenance() {System.out.println("中介安排房屋维修");}
}

2. 业务服务(房东)

@RestController
public class RentalController {@Autowiredprivate LandlordService landlordService;@PostMapping("/sign")public String signContract() {landlordService.signContract();return "签约成功";}
}

3. 客户端调用

@Service
public class LandlordService {public void signContract() {System.out.println("房东签署合同");}public void collectRent() {System.out.println("房东收取租金");}
}

4. 执行结果

访问 POST /sign
输出:
中介带租客看房
房东签署合同
中介安排房屋维修

 

八、代理模式的优势总结

  1. 职责清晰

    • 房东专注核心业务
    • 中介处理辅助事务
  2. 扩展灵活

    • 新增服务只需添加新切面
    • 不影响核心业务逻辑
  3. 解耦彻底

    • 房东不知道中介存在
    • 中介不知道房东具体实现
  4. 保护目标对象

    • 租客不直接接触房东
    • 中介控制访问流程

九、Spring AOP 代理的本质

通过代理对象包裹目标对象,在不修改原始代码的前提下,在方法执行前后插入增强逻辑,实现功能扩展。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能制造——案例解读16页制造业指标体系搭建指导【附全文阅读】

文档的主要内容可以总结如下: **文档概述**: 本文档详细探讨了企业为何需要指标体系、指标体系的定义、如何搭建指标体系、如何有效拆解和管理指标,并最后提供了制造业指标体系的参考。 **主要内容**: 1. **企业为什么需要指标体系…

Pandas 数据清洗

数据清洗是数据分析过程中至关重要的一环,也是初学者最容易忽视的步骤。本文将详细介绍如何使用Pandas进行数据清洗,涵盖空值处理、日期格式修正、错误数据识别和重复数据删除四大核心内容。 1. Pandas 清洗空值 空值是数据集中最常见的问题之一&#…

C++容器之 forward_list (单向链表)使用说明

目录 1. 语法格式 2. 说明 3. 用法示例 1. 语法格式 描述控制可变长度元素序列的对象。该序列存储为单向(前向)链接的节点列表&#xff0c;每个节点包含一个 Type 类型的成员。 template <class Type, class Allocator allocator<Type>> class forward_lis…

ali 轻量服务器安装nginx

# Ubuntu sudo apt install nginx-light # 精简版 # CentOS sudo yum install nginx #启动并设置开机自启 sudo systemctl daemon-reload sudo systemctl start nginx sudo systemctl enable nginx #验证安装 nginx -v curl -I 127.0.0.1 #常用命令&#xff1a; # 重新加载配…

【设计模式】4.代理模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 代理模式 1. 第一版 class SchoolGirl:def __init__(self):self._name Nonepropertydef name(self):return self._namename.setterdef name(self, valu…

基于微信小程序的美食点餐订餐系统

文章目录 1. 项目概述2. 项目思维导图3. 系统架构特点4. 核心模块实现代码1. 登录注册2. 首页模块实现4. 分类模块实现5. 购物车模块实现6. 订单模块实现 5. 注意事项6. 项目效果截图7. 关于作者其它项目视频教程介绍 1. 项目概述 在移动互联网时代&#xff0c;餐饮行业数字化…

[neo4j]介绍4个开源的知识图谱项目

项目主要介绍几个开源项目&#xff1a; QASystemOnMedicalKG&#xff1a;医疗知识图谱问答 https://github.com/liuhuanyong/QASystemOnMedicalKG Agriculture_KnowledgeGraph&#xff1a;农业知识图谱 Financial-Knowledge-Graphs&#xff1a;小型金融知识图谱 stock-know…

20倍光学镜头怎么实现20+20倍数实现

1. 硬件选择 球机摄像头 选择40倍光学变焦的摄像头 &#xff1a;确保摄像头具有足够的变焦能力&#xff0c;同时考虑摄像头的分辨率、帧率、夜视功能等。 内置云台 &#xff1a;许多高端摄像头已经内置了云台功能&#xff0c;如果是这样&#xff0c;可以简化机械设计和电机控制…

Axios 在 Vue3 项目中的使用:从安装到组件中的使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

【Python打卡Day50】预训练模型与CBAM注意力@浙大疏锦行

现在我们思考下&#xff0c;是否可以对于预训练模型增加模块来优化其效果&#xff0c;这里我们会遇到一个问题: 预训练模型的结构和权重是固定的&#xff0c;如果修改其中的模型结构&#xff0c;是否会大幅影响其性能。其次是训练的时候如何训练才可以更好的避免破坏原有的特征…

ONLYOFFICE Jira 集成应用程序 4.0.0 发布,含新的文件格式支持等多个重大更新!

ONLYOFFICE 与 Jira 集成的重大更新现已发布&#xff01;使用 ONLYOFFICE Docs 在 Jira Software 中处理各种办公文档&#xff0c;从 4.0.0 版本开始&#xff0c;ONLYOFFICE 连接器允许您编辑 PDF 文件和表单、直接从编辑器创建新文件、可视化用户头像、在 Jira 平台内处理新文…

安装区块链相关Geth(基于CentOS7)

注&#xff1a;由于版本冲突问题&#xff0c;请严格按如下介绍版本进行安装 安装所需资料&#xff1a;通过网盘分享的文件&#xff1a;区块链_CSDN 链接: https://pan.baidu.com/s/1dn5xcLtwwFy90xhOWKiWyA?pwdzgzs 提取码: zgzs --来自百度网盘超级会员v6的分享 一、安装运…

系统分析师——计算机系统基础

系统分析师——计算机系统基础 引言 作为系统分析师学习的第一节课&#xff0c;计算机系统基础部分构建了整个知识体系的核心框架。本文将围绕计算机系统的层次结构、硬件组成、软件分类以及关键技术点进行详细总结&#xff0c;为后续深入学习奠定基础。 本节学习内容如下图&…

JS常用设计模式汇总

1、基于类的单例模式 // PageManager.js class PageManager {constructor(config) {if (!PageManager.instance) {this.config config;this.initialized false;PageManager.instance this;this.init();}return PageManager.instance;}init() {if (this.initialized) return…

迈向软件开发 T 型人才之路:构建多元能力体系

在软件开发的广袤天地里&#xff0c;T 型人才备受瞩目。这类人才犹如具备强大能量的 “多面手”&#xff0c;既有深入专精的技术能力&#xff0c;又有广泛多元的知识与技能储备&#xff0c;能够从容应对复杂多变的项目需求&#xff0c;引领行业创新发展。于当今社会而言&#x…

SALMONN-omni论文阅读

论文链接 项目链接 名词理解&#xff1a; backchanneling&#xff1a; 指的是听话人在不打断说话人的情况下&#xff0c;用简短的语气词或动作表示“我在听”“我理解了”的反馈。 常见示例包括&#xff1a; “嗯哼”&#xff08;“uh-huh”&#xff09; “对的”&#xff08…

区块链:什么是DeFi?

DeFi&#xff08;去中心化金融&#xff0c;Decentralized Finance&#xff09; 是一种基于区块链技术的金融生态系统&#xff0c;旨在通过去中心化的方式提供传统金融服务&#xff08;如借贷、交易、储蓄等&#xff09;&#xff0c;无需依赖银行、经纪商等中介机构。DeFi主要构…

idea编译器使用git拉取、提交非常慢的原因和解决方案

前言 最近在公司换了一个电脑,但是发现这个电脑用idea编译器使用git拉取、提交各种操作非常慢,有时候需要等10分钟左右,这明显是不对劲的,说明电脑的某些环境影响到git和idea之间的整合了。 目录 在idea拉取代码非常慢的原因 解决方案 在idea拉取代码非常慢的原因 经过排查…

C语言变量的奇妙世界:探秘作用域

资料合集下载链接: ​​https://pan.quark.cn/s/472bbdfcd014​​ 在C语言的编程世界里,变量是我们存储和操作数据的基础。然而,仅仅知道如何定义和使用变量是远远不够的。一个更深层次的理解,在于掌握变量的“作用域”——也就是变量在程序中可以被访问和使用的范围。这就…

恒流源和直流稳压电源 电路

目录 前言一、恒流源电路1.低端反馈2.低端反馈注意事项注意1&#xff1a;电阻Rx注意2&#xff1a;三极管和运放的限制 3.高端反馈注意&#xff1a;自激振荡方案二 二、直流稳压电源电流1.带反馈2.不带反馈3.区别 前言 基础知识可以看个人笔记&#xff1a;个人笔记 一、恒流源…