AOP思想
AOP是Aspect Oriented Programming(面向切面编程),切面是指某一特定问题,所以AOP也可以理解为面向特定方法编程。比如我们在用户登录时设置登录校验拦截器,就是对“登录校验”这一类问题的统一处理,所以拦截器是AOP的一种应用,而AOP是一种思想,拦截器就是AOP思想的一种实现。而Spring框架也实现了这种思想,提供了拦截器技术的相关接口。
同样的,统一数据返回格式和统一异常处理,也是AOP思想的一种实现。
当然AOP思想的实现方法有很多,有SpringAOP,也有AspectJ,CGLIB等
SpringAOP
我们已经知道了统一功能之后还是需要了解SpringAOP的,拦截器作用的维度是URL(一次请求和响应),@ControllerAdvice 应用场景主要是全局异常处理(配合自定义异常效果更佳),数据绑定,数据预处理,AOP作用的维度更加细致(可以根据包、类2、方法名、参数等进行拦截),能够实现更加复杂的业务处理。
SpringAOP的核心概念
1.切点(Pointcut)
切点的作用是提供一组规则,告诉程序对那部分进行增强
2.连接点(JoinPoint)
满足切点表达式规则的方法,就是连接点,也就是可以被AOP控制的方法,上述图中的切点表达式中断包名路径下的方法都是连接点
切点和连接点的关系
连接点是切点的元素,切点是连接点的集合
3.通知(Advice)
通知就是具体要做的工作,指哪些重复的逻辑,也就是共性功能(最终体现为一个方法)
对于上述方法中程序记录方法执行耗时就是通知。
在AOP面向切面编程中,我们把这部分重复的代码逻辑抽出单独定义,这部分代码就是通知的内容。
4.切面(Aspect)
切面 =切点 + 通知
通过切面就能够描述当前AOP程序需要针对于哪些方法,在什么时候执行什么样的操作
切面既包括通知的定义和连接点的定义
切面所在的类,我们一般称为切面类(@Aspect注解标识的类)
SpringAOP的实现方式(常见面试题)
1.基于注解
2.自定义注解
3.springAPI
4.基于代理来实现
面试官:谈谈你对IOC和AOP的理解及AOP四种实现方式[通俗易懂]-腾讯云开发者社区-腾讯云
SpringAOP原理
SpringAOP是基于动代理来实现AOP的
代理模式:
也叫委托模式,为其他对象提供一种代理以控制对这个对象的访问,让我们在调用目标方法的是和,不再是直接对目标方法进行调用,而是通过代理类间接调用
使用代理前:
使用代理后:
SpringAop的实现方式
springAOP中的动态代理主要有两种实现方式:JDK动态代理和CGLIB动态代理。
JDK动态代理通过反射来接受被代理的类,并要求被代理的类必须实现一个接口。
如果目标类没有实现接口,那么SpringAOP会选择使用CGLIB来动态代理目标类。
CGLIB是一个 Code Generation Library 是一个代码生产库,可以再运行时动态的生成某i个对象的子类,CGLIB是使用继承的方式做的动态代理,因此如果某个类被标记为final,那么是无法使用CGLIB做动态代理的