Spring5之AOP为什么需要代理?

作者简介 :☕️大家好,我是Aomsir,一个爱折腾的开发者!
个人主页Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏
当前专栏Spring5应用专栏_Aomsir的博客

前言

前面的内容主要深入探讨了Spring的工厂机制。从本章开始,我们将转向Spring的另一个核心组件:AOP(面向切面编程)

Spring融合了各种设计模式,其中,AOP主要采用了代理设计模式。在接下来的文章中,我将详细解释为什么AOP需要使用代理来实现其功能

问题

分层开发中,哪一个最重要?

在JavaEE的分层开发中,项目结构通常被划分为DAO层Service层Controller层。对于开发者而言,Service层具有特殊的重要性。原因何在?

首先,Service层是项目的核心业务处理部分,它直接与用户的需求紧密相关。当我们谈论业务逻辑或业务规则时,通常是指在Service层中实现的逻辑和规则。这意味着只有Service层是真正用来满足用户业务需求的部分

其次,DAO层主要聚焦于数据存储和检索,它为Service层提供必要的数据支持。尽管数据访问对于整个应用来说是关键的,但DAO层本质上还是起到了辅助Service层完成业务处理的作用。

最后,Controller层作为前端和业务逻辑之间的桥梁,主要负责接收用户的请求并将其转发给Service层进行处理。它确保用户的请求得到正确的响应,并向用户返回相应的结果。

总之,虽然每个层都有其独特的功能和重要性,但Service层是整个应用中最直接关联到用户需求的部分,因此通常被视为最关键的部分

Service层包含哪些代码?

在JavaEE分层开发的Service层中,我们可以从功能角度将代码内容划分为两大类:核心功能和额外功能。

  • 核心功能 :它构成了Service层的主干,主要为满足用户的业务需求。这包括各种业务逻辑运算以及与DAO层的交互操作。对于复杂的应用,这部分代码可能达到几百行,它确保了应用能够按预期工作并满足用户的基本需求。
  • 额外功能 :也可以被称为附加功能,它包括但不限于事务管理日志记录性能监控等。这些功能虽然不属于业务逻辑的核心,但在某些场景下,它们对于确保应用的稳定性和高效性是至关重要的。这部分功能具有一定的可选性:根据项目的需求,开发者可以选择添加或忽略它们。

因此,从代码组织和架构的角度来看,Service层的实现通常是核心功能和额外功能的融合,两者共同确保了应用的功能完整性和高可用性。即Service层 = 核心功能(几十上百行代码) + 额外功能(附加功能)

日志记录

日志记录 在关键业务操作中起到了不可或缺的作用。例如,在转账业务中,我们不仅记录操作是否成功和发生的时间,还会在操作失败时详细注明失败的原因及涉及的用户。然而,并不是所有的业务活动都要求这样细致的日志记录。如,对于用户可以在无需鉴权的情况下直接访问的接口,过度的日志记录反而显得多余。这恰恰突显了日志功能在Service层中的"附加性"特点;即,它并非在所有场合都是必须的,而是可以根据具体业务需求灵活选择是否实施

性能监控

性能监控对于关键接口是至关重要的。例如,我们可以监视特定接口的Service执行时长,从而对其性能有个直观的了解。实现这一目标的方法相对简单:在服务的起始和结束位置插入时间戳记录,之后通过计算两个时间戳的差值即可得到执行时长。接下来,我们可以对这些数据进行分析,寻找潜在的性能瓶颈或优化机会。然而,这种监控策略并不需要加在所有接口。特别是考虑到其代码实现相对轻量。这也再次强调了性能监控作为Service层"附加功能"的特点,即它可以根据实际需求进行选择性应用

额外功能写在Service好不好?

软件设计者和开发者 的视角看,Service层应当尽可能地保持简洁,只承载与核心业务逻辑直接相关的功能。然而,当业务需求发生变化,要求加入一些"额外功能"时,这无疑会为代码的修改带来挑战,进一步影响到系统的维护性。

这种情况下,就面临着一个明确的矛盾:是否应该在Service中加入这些额外的功能?而答案是:需要加入 。但为了不使Service层过于臃肿和复杂,我们可以采用代理(Proxy)设计模式。利用代理,我们可以在不修改原始Service代码的前提下,动态地添加或者移除额外功能,这样既满足了业务需求,又保证了代码的整洁和可维护性 。此外,代理的使用还能为未来潜在的功能扩展预留空间,提高系统的灵活性和可扩展性。在Spring中,AOP就是借助代理帮助我们给Service进行增强的

总结

在之前的讨论中,我们了解到Service不仅要处理核心业务,还需要管理一些附加功能。但从软件设计的角度出发,我们期望Service层能够保持整洁和专注。为了实现这一目标,动态代理成为了一个理想的解决方案。然而,直接使用代理设计模式进行编码可能既复杂又不够直观,给开发者带来了挑战。这时,Spring的AOP技术便显得尤为宝贵。Spring AOP利用代理设计模式,帮助我们优雅地实现和管理那些额外功能,确保代码的整洁与高效

参考文献

相关推荐
边境悍匪6 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
RISCV_Explorer7 小时前
RISC-V启动与运行时规范机制解析——BRS约定、HSM多核启动与设备树要求
后端·risc-v
星栈独行7 小时前
ADK-Rust 是什么?Rust 生态新一代 AI Agent 开发套件
人工智能·后端·rust
JavaGuide7 小时前
对标 MinIO!全新一代分布式文件系统正式发布
前端·后端
用户8356290780518 小时前
使用 Python 将 DOCX 转换为 Markdown
后端·python
IT_陈寒8 小时前
Vue computed属性这个坑,我居然踩了三次才爬出来
前端·人工智能·后端
paopaokaka_luck8 小时前
小学非遗科普平台(AI 非遗科普问答,ECharts学情数据、非遗资源分类与审核,资源收藏下载与学习记录,学习任务发布和作品评分,活动报名签到与统计)
java·人工智能·spring·信息可视化·数据分析·echarts
Yize.8 小时前
Spring Task定时任务全解析:从入门到实战
java·spring
孙启超9 小时前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
烈风逍遥9 小时前
第一篇:SeaPack 全栈项目工程化实践
前端·后端·架构