什么是AOP?
与OOP对比,传统的OOP开发中的代码逻辑是自上而下的在这些自上而下的过程中会产生横切面的问题,而这些横切面与我们主业务逻辑关系不大,会散落到代码的这个地方,难以维护(如日志信息和事务管理等)
AOP是处理一些横切行问题。AOP就是把这些问题和主业务逻辑分开,达到与主业务逻辑解耦的目的。
传统OOP是自上而下的逻辑开发;
AOP
AOP是一种面向切面的编程思想。这些横切性问题,把它们抽象为一个切面,关注点在切面的编程,这就是所谓的AOP。
如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用。
可以应用于日志记录,权限验证,效率检查,事务管理…
AOP核心概念
1、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2、切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象,面向切面编程,就是指 对很多功能都有的重复的代码抽取,再在运行的时候往业务方法上动态植入“切面类代码”。
3、连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
4、切入点(pointcut)
切入点在AOP中的通知和切入点表达式关联,指定拦截哪些类的哪些方法, 给指定的类在运行的时候动态的植入切面类代码。
5、通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象
被一个或者多个切面所通知的对象。
7、织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
9、AOP代理(AOP Proxy)
在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。
使用注解
@Aspect指定一个类为切面类;
@Pointcut(“execution(* cn.itcast.e_aop_anno…(…))”) 指定切入点表达式;
@Before(“pointCut_()”)前置通知: 目标方法之前执行;
@After(“pointCut_()”)后置通知:目标方法之后执行(始终执行);
@AfterReturning(“pointCut_()”)返回后通知: 执行方法结束前执行(异常不执行);
@AfterThrowing(“pointCut_()”)异常通知: 出现异常时候执行;
@Around(“pointCut_()”)环绕通知:环绕目标方法执行;
*默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了
当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB
AOP编程其实程序员只需要参与三个部分:
定义普通业务组件
定义切入点,一个切入点可能横切多个业务组件
定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作
所以进行AOP编程的关键就是定义切入点和定义增强处理,一旦定义了合适的切入点和增强处理,AOP框架将自动生成AOP代理
即:代理对象的方法=增强处理+被代理对象的方法
参考作者:justlpf
链 接:https://www.jianshu.com/p/d682f6f3f47b
参考作者:vince_zww
链 接:https://www.jianshu.com/p/94879042db8