AOP思想
- AOP面向切面编程思想是对 OOP面向对象思想的一种补充,OOP思想通过封装、继承和多态性等概念来建立一种对象层次结构。
- 但是当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。比如日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。这种散布在各处的无关的代码被称为横切代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
- 而AOP技术则恰恰相反,它可以解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。
- 所谓“方面”,就是将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,便于减少系统的重复代码,降低模块间的耦合度。
- AOP的底层通过spring提供的动态代理技术实现的。在运行期间,spring通过动态代理技术动态的生成代理对象,代理对象执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。
AOP的一些概念
-
连接点(join point): 连接点表示可以用于增强的方法。
-
通知(Advice): 通知描述了切面何时执行以及如何执行增强处理。
-
切点(PointCut): 指我们对哪些方法进行增强。切入点是连接点的一部分。
-
切面(Aspect): 切面是通知和切点的结合。
-
引入(Introduction):引入允许我们向现有的类添加新的方法或者属性。
-
织入(Weaving): 把增强应用到目标对象来创建新的代理对象的过程。
-
Target(目标对象):要被增强的对象
-
Proxy(代理对象):一个类被AOP织入后会产生一个结果代理类。
常用AOP通知类型
- before(前置通知): 在方法开始执行前执行
- after(后置通知): 在方法执行后执行,无论是否发生异常都会执行
- afterReturning(返回后通知): 在方法执行成功后执行
- afterThrowing(异常通知): 在方法抛出异常后执行
- around(环绕通知): 将整个目标方法包裹
通知的执行顺序
- 没有发生异常时: 前置通知 目标方法 返回通知 后置通知
- 发生异常时:前置通知 目标方法 异常通知 后置通知
AOP的实现步骤
- 编写目标类和目标方法(连接点)
- 编写切面类和通知方法
- 在切面类中使用注解配置织入关系。
- 开启组件扫描和AOP的自动代理。
- spring会监控切入点方法的执行,一旦监控到,便使用代理机制,动态创建目标对象的代理对象,将增强对应的功能织入,完成完整的代码逻辑运行。