likes
comments
collection
share

Spring5之AOP为什么需要代理?

作者站长头像
站长
· 阅读数 62

前言

前面的内容主要深入探讨了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层中的“附加性”特点;即,它并非在所有场合都是必须的,而是可以根据具体业务需求灵活选择是否实施 Spring5之AOP为什么需要代理?

性能监控

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

额外功能写在Service好不好?

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

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

总结

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

参考文献

转载自:https://juejin.cn/post/7280008213672083471
评论
请登录