1.1 什么是 AOP ?
AOP 的全称是 “Aspect Oriented Programming”,即面向切面编程。
在 AOP 的思想里面,周边功能(比如性能统计,日志,事务管理等)被定义为切面,核心功能和切面功能分别独立进行开发,然后把核心功能和切面功能“编织”在一起,这就叫 AOP。
AOP 能够将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
1.2 AOP 基础概念
- 连接点(Join point):能够被拦截的地方,Spring AOP 是基于动态代理的,所以是方法拦截的,每个成员方法都可以称之为连接点;
- 切点(Poincut):每个方法都可以称之为连接点,我们具体定位到某一个方法就成为切点;
- 增强/通知(Advice):表示添加到切点的一段逻辑代码,并定位连接点的方位信息,简单来说就定义了是干什么的,具体是在哪干;
- 织入(Weaving):将增强/通知添加到目标类的具体连接点上的过程;
- 引入/引介(Introduction):允许我们向现有的类添加新方法或属性,是一种特殊的增强;
- 切面(Aspect):切面由切点和增强/通知组成,它既包括了横切逻辑的定义、也包括了连接点的定义。
上面的解释偏官方,下面用“方言”再给大家解释一遍。
- 切入点(Pointcut):在哪些类,哪些方法上切入(where);
- 通知(Advice):在方法执行的什么时机(when:方法前/方法后/方法前后)做什么(what:增强的功能);
- 切面(Aspect):切面 = 切入点 + 通知,通俗点就是在什么时机,什么地方,做什么增强;
- 织入(Weaving):把切面加入到对象,并创建出代理对象的过程,这个由 Spring 来完成。
5 种通知的分类:
- 前置通知(Before Advice):在目标方法被调用前调用通知功能;
- 后置通知(After Advice):在目标方法被调用之后调用通知功能;
- 返回通知(After-returning):在目标方法成功执行之后调用通知功能;
- 异常通知(After-throwing):在目标方法抛出异常之后调用通知功能;
- 环绕通知(Around):把整个目标方法包裹起来,在被调用前和调用之后分别调用通知功能。
aop工作流程:
第一块就是前置处理,我们在创建 Louzai Bean 的前置处理中,会遍历程序所有的切面信息,然后将切面信息保存在缓存中,比如示例中 LouzaiAspect 的所有切面信息。
第二块就是后置处理,我们在创建 Louzai Bean 的后置处理器中,里面会做两件事情:
- 获取 Louzai 的切面方法:首先会从缓存中拿到所有的切面信息,和 Louzai 的所有方法进行匹配,然后找到 Louzai 所有需要进行 AOP 的方法。
- 创建 AOP 代理对象:结合 Louzai 需要进行 AOP 的方法,选择 Cglib 或 JDK,创建 AOP 代理对象。
第三块就是执行切面,通过“责任链 + 递归”,去执行切面。
他其中的责任链是通过数组遍历实现的。责任链一般会有一个next对象,当next执行到最后一个或者中途出了问题就会退出。但因为aop中的next对象是不同类型的,所以巧妙的放在了数组中。
标签:调用,通知,切面,Louzai,AOP,springAOP,方法 From: https://www.cnblogs.com/gujiajie/p/16825298.html