搞懂AOP之三,偏序排序

本文深入探讨了AOP中偏序排序的概念及其在拦截器链顺序中的作用。首先解释了偏序关系,包括自反性、反对称性和可传递性,并通过实例说明了偏序关系与全序关系的区别。接着,讨论了在Spring AOP中,如何使用偏序排序来确定@Aspect切面配置类中@Around, @Before, @After, @AfterReturning, @AfterThrowing的执行顺序。文章最后展示了如何实现偏序排序的代码示例,强调了PartialComparable接口的重要性。" 98871811,8399986,C++封装MySQL数据库实战指南,"['数据库开发', 'C++编程', 'MySQL连接', 'VS2017', '数据库API']
摘要由CSDN通过智能技术生成

写在前面

数据结构的掌握程度决定你的coding之路能走多稳。

可能大家看到这个标题会很有疑问,怎么讲着讲着AOP开始讲起来排序了?
先说一下大家都比较熟悉的东西。回忆一下,我们如果想向容器中加入自定义的切面该怎么做?两种方法:

  1. 我们自定义Advisor注入到容器中。
  2. 利用@Aspect标示一个类为切面配置类,并利用@Around, @Before, @After, @AfterReturning, @AfterThrowing定义一些切面的实现,最后将切面配置类注入到容器中。

第一种方法我们后续会进行详细剖析。第二方法我想应该是大家比较常用的方式。而这又跟偏序排序有什么关系呢?

回想下第一篇搞懂AOP之一,拦截器链中我们说到拦截器链是List结构,而List结构注定有序。我们所使用的@Around, @Before, @After, @AfterReturning, @AfterThrowing最终也会被转换成MethodInterceptor加入到拦截器链中。那么问题来了,生成的拦截器链中的@Around, @Before, @After, @AfterReturning, @AfterThrowing顺序是如何的?谁在前,谁在后?(这里的顺序有两层含义,一是同一个切面配置类中的@Around, @Before, @After, @AfterReturning, @AfterThrowing顺序,二是多个切面配置类彼此的@Around, @Before, @After, @AfterReturning, @AfterThrowing顺序)

具体的顺序是什么我想大家在学习spring的时候都有了解过,但是这个顺序具体是如何实现的,就是我们要分析的内容,知其然也要知其所以然嘛。本文先讲一下偏序排序,在了解偏序排序的基础上,下一篇我们再深入偏序排序在AOP中的应用。

偏序关系

偏序关系是什么?我们可以从两个角度去解析。什么是“关系”?什么是“偏序”?

先来恶补一些离散数学的知识。

关系

“关系”是数字中的一个很基本的概念,站在集合的角度来看关系是怎么样的呢?

假设集合A={a,b,c,d,e,f},集合A中的元素表示6个人。其中a是b和c的爸爸,b是d的爸爸,c是e和f的爸爸。

那么集合A中的元素中符合父子关系的两个人可以用有序偶(a,b)、(a,c)、(b,d)、(c,e)、(c,f)表示。那么集合R={(a,b)、(a,c)、(b,d)、(c,e)、(c,f)}可以完整地描述出集合A中元素的父子管子,我们称R为集合A上的一个关系。

再举个栗子,集合A={1,2,3}上的小于关系可以表示为R={(1,2)、(1,3)、(2,3)}

现在我们把集合的个数扩充到两个

有两个集合A={a,b,c,d},B={x,y,z}。其中A表示a,b,c,d四位教师,x,y,z表示语文、数学和英语三门课程。a和b是语文老师、c是数学老师、d是英语老师。那么集合R={(a,x),(b,x),(c,y),(d,z)}表示教师和其所授课程之间的关系。

关系的表示

我们怎么表示关系呢?

1.关系矩阵

给定两个集合A={a1,a2…an}和B={b1,b1…bm},R是A到B的关系,则称
M R = [ c 11 c 12 ⋯ c 1 m c 21 c 23 ⋯ c 2 m ⋮ ⋮ ⋱ ⋮ c n 1 c n 2 ⋯ c n m ] M_R=\left[ \begin{matrix} c_{11} & c_{12} & \cdots & c_{1m} \\ c_{21} & c_{23} & \cdots & c_{2m} \\ \vdots & \vdots & \ddots & \vdots \\ c_{n1} & c_{n2} & \cdots & c_{nm} \\ \end{matrix} \right] MR=c11c21cn1c12c23cn2c1mc2mcnm

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值