目录
一、AOP 相关概念
1、什么是 AOP?
AOP:Aspect oriented Programming 面向切面编程/面向方面编程。
AOP 是 OOP 的延续,从 OOP 说起。
OOP:Object Oriented Programming 面向对象程序设计。
OOP 三大特征:封装、继承和多态。
oop 是一种垂直继承体系(继承)。
OOP 编程思想可以解决大多数的代码重复问题,但是有一些情况是处理不了的,比如说在一个类多个方法中相同位置拥有重复代码,OOP 就解决不了。
此时就出现了横切逻辑代码。
在多个纵向(顺序)流程中出现的相同子流程代码,我们称之为横切逻辑代码。
横切逻辑代码的使用场景很有限:一般是事务控制、权限校验、日志。
横切逻辑代码存在什么问题:
- 横切代码重复问题;
- 横切逻辑代码和业务代码混杂在一起,代码臃肿,维护不方便。
AOP 出场,AOP 独辟蹊径提出横向抽取机制,将横切逻辑代码和业务逻辑代码分析。
代码拆分容易,那么如何在不改变原有业务逻辑的情况下,悄无声息的把横切逻辑代码应用到原有的业务逻辑中,达到和原来一样的效果,这个是比较难的。
2、AOP在解决什么问题?
在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。
3、为什么叫做面向切面编程?
「切」:指的是横切逻辑,原有业务逻辑代码我们不能动,只能操作横切逻辑代码,所以面向横切逻辑。
「面」:横切逻辑代码往往要影响的是很多个方法,每一个方法都如同一个点,多个点构成面,有一个面的概念在里面。
二、Spring AOP 相关概念
1、AOP本质:
在不改变原有业务逻辑的情况下增强横切逻辑,横切逻辑代码往往是权限校验代码、日志代码、事务控制代码、性能监控代码。
2、AOP 术语:
名称 | 解释 | 说明 |
---|---|---|
Joinpoint(连接点) | 它指的是那些可以用于把增强代码加入到业务主线中的点,这些点指的就是方法。 在方法执行的前后通过动态代理技术加入增强的代码。 在 Spring 框架 AOP 思想的技术实现中,也只支持方法类型的连接点。 |
方法开始时、结束时、正常运行完毕时、方法异常时等这些特殊的时机点, 我们称之为连接点,项目中每个方法都有连接点,连接点是一种候选点。 |
Pointcut(切入点) | 它指的是那些已经把增强代码加入到业务主线进来之后的连接点。 | 指定AOP思想想要影响的具体方法是哪些,描述感兴趣的方法。 |
Advice(通知/增强) | 它指的是切面类中用于提供增强功能的方法。 并且不同的方法增强的时机是不一样的。 比如, 开启事务肯定要在业务方法执行之前执行; 提交事务要在业务方法正常执行之后执行; 而回滚事务要在业务方法执行产生异常之后执行等等。 那么这些就是通知的类型。其分类有: 前置通知、后置通知、异常通知、最终通知、环绕通知。 |
第一个层次:指的是横切逻辑; 第二个层次:方位点 (在某一些连接点上加入横切逻辑,那么这些连接点就叫做方位点,描述的是具体的特殊时机) |
Target(目标对象) | 它指的是代理的目标对象。即被代理对象。 | |
Proxy(代理) | 它指的是一个类被 AOP 织入增强后,产生的代理类。即代理对象。 | |
Weaving(织入) | 它指的是把增强应用到目标对象来创建新的代理对象的过程。 spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。 |
|
Aspect(切面) | 它指定是增强的代码所关注的方面,把这些相关的增强代码定义到一个类中,这个类就是切面类。 例如,事务切面,它里面定义的方法就是和事务相关的; 像开启事务,提交事务,回滚事务等等,不会定义其他与事务无关的方法。 |
Aspect切面:切面概念是对上述概念的一个综合。 Aspect切面 = 切入点 + 增强 = 切入点(锁定方法)+ 方位点(锁定方法中的特殊时机) + 横切逻辑。 |
众多的概念,目的就是为了锁定要在哪个地方插入什么横切逻辑代码。
3、Spring 中 AOP 的代理选择:
- Spring 实现 AOP 思想使用的是动态代理技术。
- 默认情况下,Spring 会根据被代理对象是否实现接口来选择使用 JDK 还是 CGLIB。
- 当被代理对象没有实现任何接口时,Spring 会选择 CGLIB。
- 当被代理对象实现了接口,Spring 会选择 JDK 官方的代理技术,
- 不过我们可以通过配置的方式,让 Spring 强制使用 CGLIB。
文章内容输出来源:拉勾教育Java高薪训练营;