被面试官问烂的Spring AOP原理,你是怎么答的?

简介: Spring AOP在Spring体系中深不可测,Spring AOP原理也是经常在互联网大厂面试时被问到,今天,我给大家抽丝剥茧,详细到你无法想象。我划分为四个阶段给大家介绍:创建代理对象阶段、拦截目标对象阶段、调用代理对象阶段、调用目标对象阶段。

**往期视频已整理成文档形式,需要的可S我免费领取**


Spring AOP在Spring体系中深不可测,Spring AOP原理也是经常在互联网大厂面试时被问到,今天,我给大家抽丝剥茧,详细到你无法想象。我划分为四个阶段给大家介绍:创建代理对象阶段、拦截目标对象阶段、调用代理对象阶段、调用目标对象阶段。

d81eafc704734790bddd22ae1a61b6d5.png

我整理了一张完整的Spring AOP设计原理UML图,需要高清图的小伙伴可以私信我。

f47f9dcd12a0484f829da2ed569eba20.png

下面详细介绍每个阶段的执行细节。


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

在Spring中,创建Bean实例都是从getBean()方法开始的(出现getBean()动画),在实例创建之后,Spring容器将根据AOP的配置去匹配目标类的类名,看目标类的类名是否满足切面规则。如果满足满足切面规则,就会调用ProxyFactory创建代理Bean并缓存到IoC容器中。(出现调用ProxyFactory创建代理Bean动画)根据目标对象的自动选择不同的代理策略。(出现选择代理策略动画)如果目标类实现了接口,Spring会默认选择JDK Proxy,如果目标类没有实现接口,Spring会默认选择Cglib Proxy,当然,我们也可以通过配置强制使用Cglib Proxy。

d0fdb91303b24ac89e8da1c1147ab7af.png

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

当用户调用目标对象的某个方法时,(出现AopProxy对象拦截)将会被一个叫做AopProxy的对象拦截,Spring将所有的调用策略封装到了这个对象中,它默认实现了InvocationHandler接口,也就是调用代理对象的外层拦截器。(出现调用InvocationHandler的invoke()方法动画)在这个接口的invoke()方法中,(出现触发MethodInvocation的proceed()方法动画)会触发MethodInvocation的proceed()方法。在这个方法中会按顺序执行符合所有AOP拦截规则的拦截器链。

610b5b12d0e64626a4a7a0c3191584f5.png

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

Spring AOP拦截器链中的每个元素被命名为MethodInterceptor,(出现反射调用Advice对象

动画)其实就是切面配置中的Advice通知。这个回调通知可以简单地理解为是新生成的代理Bean中的方法。(出现执行织入代码动画)也就是我们常说的被织入的代码片段,这些被织入的代码片段会在这个阶段执行。

ef9ef92397f3477c927646c915d6c312.png

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

MethodInterceptor接口也有一个invoke()方法,(出现执行MethodInterceptor的invoke()方法动画)在MethodInterceptor的invoke()方法中会触发对目标对象方法的调用,也就是反射调用目标对象的方法。(出现调用目标对象动画)

c59e2436c94a45c0a6eccb67c2830f90.png

Spring AOP原理就分析到这里,最后,总结一下不迷路:

(出现代理对象动画)

1、代理对象:就是由Spring代理策略生成的对象;

(出现目标对象动画)

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

(出现织入代码动画)

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

(出现切面通知动画)

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

(出现MethodInvocation动画)

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

(出现MethodInterceptor动画)

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

2c33a06e3f724a6891c4a718b7b84095.png

都看到这里了,你还觉得Spirng AOP原理难吗?我再送给大家一张精简版的Spring AOP执行流程图,需要的小伙伴立马关注点个赞。

37301070a1d1417a97d424cc8f3e1206.png

我是被编程耽误的文艺Tom,如果大家还有其他疑问,可以在评论区留言。如果本次面试解析对你有帮助,请动动手指一键三连分享给更多的人。关注我,面试不再难!


往期视频已经整理成文档形式,需要的小伙伴可S我,海量干货免费领!只弹干货不参水!

相关文章
|
3月前
|
缓存 Java 开发者
【Spring】原理:Bean的作用域与生命周期
本文将围绕 Spring Bean 的作用域与生命周期展开深度剖析,系统梳理作用域的类型与应用场景、生命周期的关键阶段与扩展点,并结合实际案例揭示其底层实现原理,为开发者提供从理论到实践的完整指导。
508 22
|
3月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
1302 0
|
3月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
452 0
|
2月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
2月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
422 2
|
4月前
|
Java 关系型数据库 数据库
深度剖析【Spring】事务:万字详解,彻底掌握传播机制与事务原理
在Java开发中,Spring框架通过事务管理机制,帮我们轻松实现了这种“承诺”。它不仅封装了底层复杂的事务控制逻辑(比如手动开启、提交、回滚事务),还提供了灵活的配置方式,让开发者能专注于业务逻辑,而不用纠结于事务细节。
|
4月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
4月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。