AOP
AOP
什么是 AOP
AOP:Aspect oriented programming 面向切面编程,AOP 是 OOP(面向对象编程)的一种延续。
下面我们先看一个 OOP 的例子。
OOP 编程思想可以解决大部分的代码重复问题。但是有一些问题是处理不了的。比如在父类 Animal 中的多个方法的相同位置出现了重复的代码,OOP 就解决不了。
AOP 解决了什么问题
通过上面的分析可以发现,AOP 主要用来解决:在不改变原有业务逻辑的情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。
AOP 为什么叫面向切面编程
- 切 :指的是横切逻辑,原有业务逻辑代码不动,只能操作横切逻辑代码,所以面向横切逻辑
- 面 :横切逻辑代码往往要影响的是很多个方法,每个方法如同一个点,多个点构成一个面。这里有一个面的概念
Spring AOP主要是通过代理实现的。具体来说,Spring AOP使用动态代理来创建代理对象,这些代理对象可以拦截方法调用并执行额外的逻辑。
Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。如果目标对象实现了至少一个接口,则使用JDK动态代理;否则,使用CGLIB代理。
在JDK动态代理中,代理对象实现了目标对象的接口,并将方法调用委托给目标对象。在CGLIB代理中,代理对象继承了目标对象,并重写了目标对象的方法,从而实现了方法拦截。
Spring AOP使用切面来定义横切关注点,并使用通知来实现横切逻辑。通知是在切点处执行的代码,可以在方法执行前、执行后或抛出异常时执行。Spring AOP支持五种类型的通知:
- 前置通知、
- 后置通知、
- 返回通知、
- 异常通知
- 环绕通知
在Spring AOP中,切面是由切点和通知组成的。切点定义了哪些方法需要被拦截,通知定义了拦截后执行的逻辑。Spring AOP还支持切点表达式,可以使用切点表达式来定义更复杂的切点。
总之,Spring AOP通过代理实现,使用动态代理来创建代理对象,并使用切面和通知来实现横切逻辑。
原理
Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理,如下图所示:
AOP 切面编程设计到的一些专业术语:
术语 | 含义 |
---|---|
目标(Target) | 被通知的对象 |
代理(Proxy) | 向目标对象应用通知之后创建的代理对象 |
连接点(JoinPoint) | 目标对象的所属类中,定义的所有方法均为连接点 |
切入点(Pointcut) | 被切面拦截 / 增强的连接点(切入点一定是连接点,连接点不一定是切入点) |
通知(Advice) | 增强的逻辑 / 代码,也即拦截到目标对象的连接点之后要做的事情 |
切面(Aspect) | 切入点(Pointcut)+通知(Advice) |
织入(Weaving) | 将通知应用到目标对象,进而生成代理对象的过程动作 |