面试常问的Spring AOP底层原理

 AOP底层原理可以划分成四个阶段:创建代理对象阶段、拦截目标对象阶段、调用代理对象阶段、调用目标对象阶段

第一阶段:创建代理对象阶段

  1. 通过getBean()方法创建Bean实例
  2. 根据AOP的配置匹配目标类的类名,判断是否满足切面规则,规则指的是:
    // 切面规则:匹配所有以 "Service" 结尾的类的所有方法
    execution(* com.example.*Service.*(..))
    
  3. 如果满足规则,调用ProxyFactory创建代理Bean并缓存到IoC容器中
  4. 根据目标对象的是否实现接口选择不同的代理策略,通常是JDK Proxy(基于接口的代理)或Cglib Proxy(基于类的代理)

目标对象:就是我们自己写的业务代码

第二阶段:拦截目标对象阶段

  1. 当用户调用目标对象的方法的时候,被一个名为AopProxy的对象拦截
  2. AopProxy对象封装了所有的调用策略,并且实现了IncationHandler接口
  3. 在IncationHandler的invoke()方法中,出发了MethodInvocation的proceed()方法
  4. proceed()方法按照顺序执行符合所有AOP拦截规则的拦截器链

其中invoke() 方法用于定义切面的逻辑,而 proceed() 方法用于在拦截器链中继续执行下一个拦截器或最终执行目标方法

MethodInvocation:负责执行拦截器链,在proceed()方法中执行;

第三阶段:调用代理对象阶段

  1. AOP拦截器链中的每个元素被称为MethodInterceptor,即切面配置中的Advice通知
  2. MethodInterceptor接口的invoke()方法被织入的代码片段
  3. 这些被织入的代码片段在这个阶段执行,通常是切片配置中定义的通知方法

织入代码:就是要在我们自己写的业务代码增加的代码片段;

切面通知:就是封装织入代码片段的回调方法;

负责执行织入的代码片段,在invoke()方法中执行。

第四阶段:调用目标对象阶段

  1. 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;
        }
    }
    

相关推荐

  1. SpringAOP实现原理

    2024-01-30 03:34:01       53 阅读
  2. 面试问题

    2024-01-30 03:34:01       36 阅读
  3. 面试问题

    2024-01-30 03:34:01       42 阅读
  4. 数据库面试

    2024-01-30 03:34:01       36 阅读
  5. MySQL几个面试

    2024-01-30 03:34:01       38 阅读
  6. 面试中,我c++问题

    2024-01-30 03:34:01       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-30 03:34:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-30 03:34:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-30 03:34:01       82 阅读
  4. Python语言-面向对象

    2024-01-30 03:34:01       91 阅读

热门阅读

  1. OpenSSH 9.6/9.6p1 (2023-12-18)的发布说明(中文译文)

    2024-01-30 03:34:01       66 阅读
  2. Apache孵化器领路人与导师的职责

    2024-01-30 03:34:01       65 阅读
  3. jQuery 和 Zepto 的区别? 各自的使用场景?

    2024-01-30 03:34:01       60 阅读
  4. react的hooks的useCallback:

    2024-01-30 03:34:01       56 阅读
  5. python笔记9

    2024-01-30 03:34:01       42 阅读