AOP基础
AOP概述
首先我们要知道AOP是什么?
看下图

个人解析:
AOP叫做面向切面编程,但是实际上就是面向方法编程
图中下面一部分是一个AOP的案例
AOP快速入门案例代码实现
案例:测出业务中各个业务方法所需的执行时间
如果我们一个个对每个方法进行改代码,这样太过繁琐,然后我们就引入进来了AOP
下面是对这个案例的代码实现

第一步:我们要引入springAOP的依赖
第二步:编写AOP的代码
代码分析:
@Aspect这个注解是意味,这个类为有关AOP的类,也就是切面类,待会会介绍概念
然年@Around注解,以及后面一大串,在下面已经解释
之后的一些代码就是计算运行时间的逻辑代码,无需多介绍
AOP核心概念
如下图

个人理解:
有些概念已经介绍的十分清晰,我就来分析一下不太清晰的概念
切入点和切入点表达式
这两个其实是紧密相连的,切入点表达式表达出来的正是切入点
更通俗的来说就是,这些可调用的连接点,切入点表达式表达出来的是连接点的其中一些,而满足切入点表达式的连接点,我们又叫做切入点
AOP执行顺序

假设我们现在是在测试list方法的运行时间,左上角是我们定义的切面类,而切入点表达式(不是图中的切入点表达式,我们只是假设)指向的list方法,那么list方法我们就叫做它为切入点
然后这个list所在的类的对象为目标对象
左下角采取依赖注入的方法注入的并不是目标对象,如果是这样的话,AOP就白写了
AOP最本质上是基于动态代理来实现的
所以目标对象会自动加载为右下角的那个代理对象,而代理对象里的list方法是加强后的方法
也就是能够获得运行时间的list方法
所有左下角注入的对象是代理对象
然后左下角利用代理对象调用的lst方法自然也是加强后的list方法了,这样就完成了案例要求
以上就是这个案例AOP的执行顺序
AOP进阶
通知类型
通知分为很多类型,以下图片为通知类型的介绍,内容比较详细

其实看文字意思就能够明白各个类型的区别
如果还是看不懂,可以参考下面图片中的代码,包含了所有的通知类型的测试




以上就是所有代码
然后我们要引入一个注释
由于有些时候切入点的表达式一直在重复,所以我们可以利用一个注解提取出来,请看下图

通知顺序
这个通知顺序,就很简单了,了解以下就是了
看下图

切入点表达式
我们之前都是了解什么是切入点表达式
接下来我们要了解切入点表达式是如何写的
切入点表达式的写法有两种形式,如下图

execution
下面图中第一行介绍的式它的语法结构
图中打了?的意思是,?之前的一个内容可以省略,注意我说的是前一个,而不是多个
但是我们一般不省略,直接写出它的完整格式来
下图下面,还介绍了表达式中常用的通配符,这样就可以大大简短了代码长度
这个十分重要,看下图的解释我们应该也能明白怎么用

下图是一些书写规范的建议,可看可不看,反正就是尽量少省略

@annotation
当我们使用execution来写表达式的时候难免会遇到一个表达式写不出来,需要两个表达式来写的,如下图

为了解决这个问题,我们就引入了这个@annotation表达式
这个切入点表达式如何来用呢?
第一步:创建一个annotation的类(不是普通的类和接口)
个人感觉这就像是自己定义以一个注解,
到后面就可以看出来
,如下图

第二步:书写该类的一些注释

对代码进行分析:
第一行的注解表示的是,在运行时生效
第二行注解表示的是作用的目标是方法
由于这个类就是起一个标记作用,所以不用再写多余的代码
第三步:给切点类做上标记
如下图的MyLog这个注解,这个是我们上面自己定义的类的名字
所以我个人感觉上面就像是自己定义了一个注解

最后一步:写切入点表达式
凡是被做了标记的,就都行

连接点
我们刚开始的AOP入门是测试方法的运行时间,但是我们有时候并不是这个要求
而是获取连接点的某个信息
接下来就是如何获取连接点方法的信息的方法
首先这个是要分通知类型的,分为两个部分,每个部分获取信息的方法略有不同
如下图有详细介绍
下图为@Around通知类型

下图为其他通知类型

然后下图便是我们如何具体实现代码

记住返回值改一下,不是null
