[java-spring]-spring-AOP
文章目录
虽然 AOP 不经常被讨论,但是它在 Spring 中有着广泛的应用。对你来说,也许是时候去熟悉 AOP 并让它为你所用了。
你了解 Spring AOP 吗?你有在你目前的 Spring Boot 项目中使用它吗?如果没有,这篇文章就是为你准备的!
最近,我看到很多项目都在使用 Spring Boot 和其他优秀框架开发的最新技术。一方面,这听起来是很棒的,但是另一方面,我经常看到很多开发人员并没有充分利用这些新技术的全部有点。
我认为主要是因为多数的书和文档都过于学术化并且晦涩难懂。所以这就是为什么我决定谈一谈我对面向切面编程(aspect-oriented programming)
的一点理解。
什么是面向切面编程
面向切面编程是一种编程范式,试图解决横切关注点(cross-cutting concerns)
的问题。面向切面编程(AOP)是对面向对象编程(OOP)的一种补充,它提供了一种不同的方式去思考程序的结构。
在 OOP 中最小的单元是类(class)
,而在 AOP 中最小的单元是切面(aspect)
。
更通俗地讲就是,AOP 有助于我们将不同但是有必要的重复性代码重构为不同的模块
。这么做的好处是,我们可以将这些重复性代码集中管理起来复用,而不是每次都要重复写一遍。
这种方法的好处是,代码将会变得更易于维护,从而将业务逻辑从杂乱的代码中脱离出来,专注于业务逻辑代码的开发。我们将这些不同的功能划分到不同的切面中。
一个切面是对杂乱地散落在各个类中的横切关注点的模块化。比如,集中日志记录
或事务管理
就是最好的例子。
使用 AOP 简化代码
让我们看看如下的示例代码。
在这里,你会意识到有些代码是于业务逻辑无关的。所以,我们应该要将它们抽离出来,放到其他地方,将业务逻辑单独分出来处理。
AOP 如何大规模运作
如果你的系统中有些包和类中没有使用 AOP,例如跟踪,事务和异常处理,那么就必须在每个类和方法中去实现它们。
这么做的结果就是会导致如下两个问题:
- 代码纠缠(Code tangling) 每个类和方法中都包含代码追踪(tracing),事务以及异常处理——甚至是业务逻辑。在一个这样的方法中,很难分清代码中实际做的是什么处理。
- 代码交叉(Code scattering) 诸如事务之类的切面分散在代码各个角落中,而不是在系统中特定的地方实现。
使用 AOP 能够帮助你解决这样的问题。所以,在这里 AOP 所做的就是将所有散落各处的事务代码集中到一个事务切面中。然后,将所有的追踪代码(tracing code)集中到一个切面中。最后,将异常处理集中到一个切面中。
至此,就可以是实现业务逻辑和其他切面之间的分离。
横切关注点
AOP 中一个最重要的概念是横切关注点(cross-cutting concerns)
。在上面,我举了 AOP 的几个例子追踪,异常处理和事务(tracing, exception handling, and transactions)
,这些全都是横切关注点。一些类和方法必须实现它们。
在经典的面向对象编程中,无法将它们集中到一个地方统一实现,因此无法避免代码纠缠和胡乱交叉。
而面向切面编程则允许你在一个集中的地方实现横切关注点。所以,如果使用 AOP,那么将会允许你先实现你的业务逻辑,然后再统一处理横切关注点的问题。
通过这种方式,你可以编写基础结构并决定是否要将事务或日志记录添加到代码中。因此,你可以创建自己的中间件。然后,使用 Spring AOP 将这些切面添加到程序中,以便程序处在在运行时
状态的时候,实际地去执行这些切面和主要的业务逻辑。
什么是 Spring AOP?
如果你看过我的文章《What is Spring framework in java?》,那么你一定知道 Spring AOP 是 Spring 的核心模块之一。
Spring AOP 通过消除代码纠缠和交叉问题,在我们的项目中支持面向切面的模块化。将 Spring AOP 库添加到我们的项目中,你将会开始体验到使用它的一些组件所带来的好处。
这些组件如 注解(annotation)
、建言(advice)
、连接点(join points)
、以及切点(point cuts)
。
通常,你会使用 AOP 来实现企业级的功能开发,从而使 Spring 框架更加实用。
AOP 允许你准确地将你所定义的切面集中到特定的地方。因此,你将获得可配置的中间件。如果你想要更加深入地了解 Spring AOP,请继续关注接下来要发表的文章或这个网站。
总结
在这篇文章中,我尝试去说清楚面向切面编程的概念并介绍了它与 Spring 框架之间的关系。在我的下一篇文章中,我将深入探讨 Spring AOP 的库,以及它的核心是什么,它是如何使用的,向往能够对你有所帮助。请在评论中留下您的想法,不要忘记分享!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-03-09 人形词云,根据图片黑白形状绘制词云
2020-03-09 汉化的simple词云
2020-03-09 对于数据的平均值处理
2020-03-09 文字替换成函数返回数字进行排序
2020-03-09 校验
2020-03-09 Python:使用lambda对列表(list)和字典(dict)排序
2020-03-09 python中的数据排序