介绍AOP

介绍AOP

前言

在本篇笔记中,我将讨论面向切面编程(AOP)。面向切面编程是Spring提供的一个功能,我们在之前的笔记中详细介绍了依赖注入。在本部分中,我们将深入探讨面向切面编程。
AOP不仅是Spring提供的一个功能,实际上它本身就是一种编程模型。所以在我们开始讲解面向切面编程之前,我想简要介绍一下函数式编程。

函数式编程

如果你曾经使用过一些较老的编程语言,比如C,你就会知道这是什么。在这些语言中编写代码时,你会思考一个问题,然后将其分解为不同的函数。每个函数完成特定的工作单元,函数可以调用其他函数,它们彼此相互连接。整个程序由所有这些不同的函数组成。如果你在函数式编程语言中编写代码,你会将它们视为不同的函数。

这里的问题是,如果设计复杂,你会有大量的函数和函数之间的独立性。这个图可能会变得非常混乱。对于某些情况,你会得到一个更好的设计,你会使用面向对象编程,以便更好地设计你的代码。你会有一个更清晰的设计和关注点的分离。这很好,但是这里有一个问题。你的程序想要做的并不是所有的任务都可以分类为对象。在这里插入图片描述

现在让我们举个例子,比如说,你有一个在不同对象中共享的通用过程。我举了一个日志消息的例子,所以我想要一个日志消息方法,在三个不同的对象中运行并包含在内。现在日志消息方法做什么?简单来说,它输出一条消息,你希望这个功能存在于你的代码中的所有对象中。那你会怎么做呢?你会在每个对象中都有一个日志消息方法,所以无论有多少个对象需要,日志消息函数都会在这些对象的每一个中添加日志消息方法。这不是一个好的设计,因为你在不同的对象中包含了相同的方法。
在这里插入图片描述

那你会如何优化代码呢?一种方法是将该方法提取出来,创建一个单独的对象。当然,你不能只是留下一个方法,你必须在对象中有一个对象。所以你会在一个新对象中有一个日志消息方法,叫做日志对象,然后ab对象不再有一个日志消息方法。相反,会发生什么呢?当需要调用日志消息时,它会引用日志方法然后执行日志对象以执行日志消息。它可能会有一个依赖,所以它会创建一个新的方法并调用该方法,这将是一个静态方法,然后它会懒惰地调用该方法。它也可以是一个基类,然后你可以将日志消息功能继承到每个需要这个方法的对象中。所以这是好的,但是这里有几个问题。第一个问题。现在让我们来看一下。做设计时,你想要画一个描述不同对象之间关系的图表。你想要知道哪个对象是真正重要的,我们知道它们如何连接到其他对象,你想要知道连接到其他对象的最大对象。现在如果你为这样的设计编写这个图表,很可能最重要的对象和最连接的对象可能不是你的业务对象,而可能是这个日志对象,因为需要日志记录的对象与这个日志对象有依赖关系。所以依赖于这个不是真正属于你的业务问题的东西不是一个好主意。所以你对这个日志对象有太多的依赖关系。日志对象并不真正添加业务价值,它只是提供支持功能。这就是为什么你对这些不同对象有太多关系的原因。当我说关系对象时,我是指涉及你问题中的不同其他对象的对象。
在这里插入图片描述

第二个问题。你仍然需要在所有方法中调用以进行调用。你已经将日志消息功能移除了,例如,你将其放入了一个更长的对象中,但是你仍然需要在你的业务对象的每个方法中调用这些方法来调用该日志对象的日志消息方法。你已经移除了方法,但实际上你并没有移除调用该方法的代码,你不能移除它,因为它必须被调用并且方法必须执行。问题是当你想要批量更改时,你会怎么做,比如说你想要一个不同的日志消息方法,你需要在所有这些不同的业务对象中进行更改来调用该方法。当然,你可以使用一些更智能的设计来解决这个问题。你可以有一个接口类,然后你可以插入不同的日志方法。但是如果不是这种情况,如果你不能使用一个共同的接口来解决问题,你就需要去每个类并且你需要进行代码更改。
在这里插入图片描述

为什么这些问题很重要?这些问题很重要,因为在软件设计中,拥有一个抓取对象的整个概念是非常常见的。所以你可以在许多情况下看到这种情况,其中你有一些功能需要被不同的对象使用,但它们可能不是域的一部分。它可能与基础设施相关,也可能与安全相关。这些都是在正常的铁路应用程序中看到的一些常见的抓取共识。几乎每个主要应用程序在每个事务中都会做一些日志记录,我想说,这是必要的恶。你将不得不根据你的业务问题和使用数量来实现它们。

所以由于这是一个常见的问题,有办法解决它,我们可以使用面向切面编程作为解决这个问题的一种非常优雅的尝试。
在这里插入图片描述

好的,那么让我们看看面向切面编程如何改变事物。所以你会把共同功能从a、b和c对象中移除。相反,你不会为日志记录创建新的类。你会为日志记录创建一个新的切面。所以实际上它是一个类,我会说,如果你从普通类看看aspect是什么,下面的内容就是它是一个特殊权限的类。所以你有一个日志切面类,它与你的普通类和对象定义分开。你可以有许多方面。你可以有一个事务方面来实现事务相关的横切关注点。现在你可能会问,这与拥有单独的对象有什么不同?你会为日志记录和交易方面都有一个对象,你如何不一样?不同的是在这里的第二点,创建了这些单独的方面后,你不会在你的代码中引用这些方面。如果你想要让b和c对象中的一些方法使用日志和交易方面,如果它是一个普通类,你会怎么做,你将必须实例化一个类的对象然后调用这些方法。你没有一些方面你将做什么?在这种情况下,你会定义一个配置,这个切面配置告诉哪些对象的哪些方法应该应用于哪些方面。所以这与传统的对象或编程不同,传统的编程中你会将这些通用功能提取出来,创建一个单独的类,有对象,然后在你的对象内部引用那些对象真正需要那些功能的对象。你会有方面,然后你会写配置,告诉哪个方面适用于哪个类的哪些方法。所以这是Spring为我们提供的一些东西,你知道Spring为我们提供了依赖注入。你告诉我我的对象依赖于这些对象,然后你告诉Spring注入这些依赖项。Spring也在这里帮助我们。Spring说他已经为你提供了依赖项。你告诉我哪些方面是哪些方法我会确保那些方法也被调用。所以现在让我们假设,例如,我在所有这些对象中有一组特定的方法。我想要一个日志方面的方法,所以我在这里有一个日志方法。我希望这个方法在执行这些方法之前运行。所以,我在这里有这些方法。我在这里有两个方法,并且我在这里有一个方法,我希望在这些方法执行之前运行日志方法。所以无论我做什么,我都可以做这个并编写配置。并说,对于所有这些方法,确保运行日志方法,无论这些方法是否被调用。所以这是我可以告诉Spring要做的事情,Spring将确保在配置的方法执行之前运行日志方法。所以这只是一个你可以应用方面的事情之一。这类似于,比如说,你有cell d过滤器。你可以配置方法,在cell d的每个方法执行之前运行。你有类似的例外情况,这些方法执行时。你可以这样想象。比如说,你有数据表中的触发器。你想要在插入或写入触发器,所以无论什么时候发生插入,也有其他功能被执行。所以方面有点类似于这个。你可以在方法的前后有执行的方面,所以如果你这样配置,这个方法将被执行,然后你的目标方法将被执行,然后另一个方面被执行。所以你有很大的灵活性。所以我们来看看你可以在这些方面中实现的所有不同的配置。所以这是你可以牢记的一些东西。你可以有不同层次的控制,你可以使用方面来进行配置。那么我们需要采取哪些步骤来编写切面编程呢?第一步是编写方面。我们需要确定什么是这些横切关注点,并将它们编写为方面。第二步是配置这些方面应用的位置。所以我们谈论了日志记录。我们可以选择特定的方法,为这些方法选择日志记录和事务处理,在执行之前进行。所以这是你需要做的唯一两个步骤,首先是编写方面本身,然后是配置这些方面应用到你的代码中的哪些地方。好的,既然我们已经涵盖了面向切面编程的概念,在下一个教程中,我们将实际编写一些方面,并对它们进行配置,并让Spring执行这些方面。所以希望这些概念清楚了。我会在接下来的笔记中讲解。
在这里插入图片描述

  • 31
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值