Spring AOP 基础概念

目录

一、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高薪训练营;

上一篇:运用Spring Aop,一个注解实现日志记录


下一篇:Spring AOP 快速入门使用