AOP底层原理可以划分成四个阶段:创建代理对象阶段、拦截目标对象阶段、调用代理对象阶段、调用目标对象阶段
第一阶段:创建代理对象阶段
- 通过getBean()方法创建Bean实例
- 根据AOP的配置匹配目标类的类名,判断是否满足切面规则,规则指的是:
// 切面规则:匹配所有以 "Service" 结尾的类的所有方法 execution(* com.example.*Service.*(..))
- 如果满足规则,调用ProxyFactory创建代理Bean并缓存到IoC容器中
- 根据目标对象的是否实现接口选择不同的代理策略,通常是JDK Proxy(基于接口的代理)或Cglib Proxy(基于类的代理)
目标对象:就是我们自己写的业务代码
第二阶段:拦截目标对象阶段
- 当用户调用目标对象的方法的时候,被一个名为AopProxy的对象拦截
- AopProxy对象封装了所有的调用策略,并且实现了IncationHandler接口
- 在IncationHandler的invoke()方法中,出发了MethodInvocation的proceed()方法
- proceed()方法按照顺序执行符合所有AOP拦截规则的拦截器链
其中invoke()
方法用于定义切面的逻辑,而 proceed()
方法用于在拦截器链中继续执行下一个拦截器或最终执行目标方法
MethodInvocation:负责执行拦截器链,在proceed()方法中执行;
第三阶段:调用代理对象阶段
- AOP拦截器链中的每个元素被称为MethodInterceptor,即切面配置中的Advice通知
- MethodInterceptor接口的invoke()方法被织入的代码片段
- 这些被织入的代码片段在这个阶段执行,通常是切片配置中定义的通知方法
织入代码:就是要在我们自己写的业务代码增加的代码片段;
切面通知:就是封装织入代码片段的回调方法;
负责执行织入的代码片段,在invoke()方法中执行。
第四阶段:调用目标对象阶段
- MethodInterceptor接口中的invoke()方法触发对目标对象方法的调用,即反射调用目标对象的方法,例如:
public class MyInterceptor implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("Before method execution"); // 通过反射调用目标对象的方法 Object result = invocation.proceed(); System.out.println("After method execution"); return result; } }