Spring AOP
文章平均质量分 88
Spring AOP
冰糖心书房
Hi:欢迎来到"冰糖心书房",人个目前就职于一家外企业500强公司担任架构师一职,在这里我会着重分享我多年来在Java开发领域的实战经验和心得体会。从企业级项目架构设计、高并发处理到微服务架构的落地实施。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
怎么查看一个方法是否被 AOP 成功增强
方法优点缺点适用场景打印类名简单、快速、直观需要修改代码并运行快速验证、简单调试IDE 提示最高效、最直观、无需运行依赖特定 IDE (IntelliJ Ultimate)日常开发首选查看堆栈无需改代码,信息详细需要调试或有异常抛出Debugging、异常排查静态分析从根本上理解原因需要熟悉代码和 AOP 规则代码审查、问题根源分析诊断工具功能强大,适用于生产环境需要学习工具的使用生产环境问题排查、深度分析。原创 2025-07-03 18:37:51 · 1012 阅读 · 0 评论 -
AOP 的性能损耗主要体现在哪些方面?
性能损耗方面Spring AOP (动态代理)AspectJ (静态织入)主要发生阶段运行时(Runtime)编译期启动时开销有(创建代理对象)无运行时开销有(方法拦截、构建调用链、反射)几乎为零(直接调用)性能瓶颈主要在于调用链的执行和通知代码本身主要在于编译速度结论对于绝大多数 Web 应用和企业级系统,Spring AOP 的性能开销完全可以接受。其带来的开发便利性和代码解耦的好处远大于这点微小的性能损耗。只有在对性能要求极其苛刻的场景,如高频交易系统、底层计算引擎、实时游戏服务器。原创 2025-07-01 15:36:28 · 1044 阅读 · 0 评论 -
使用 AOP 会有性能开销吗?
特性Spring AOP (动态代理)AspectJ (静态织入)实现原理运行时创建代理对象编译期或加载期修改字节码主要开销运行时的方法拦截和调用链编译期的织入过程运行时性能有轻微开销,通常可忽略几乎无开销,接近原生调用适用场景绝大多数 Web 应用和企业级应用对性能要求极致的场景、需要增强非 Spring Bean 的场景。原创 2025-07-01 11:41:36 · 1045 阅读 · 0 评论 -
一个代理对象被调用时,方法调用的链路是怎样的?
责任链模式: 整个调用链路是一个标准的责任链,每个通知都是链上的一个节点。递归驱动方法通过递归调用,将控制权依次传递给链上的每一个通知,最后到达目标方法。上下文传递对象作为上下文,贯穿整个调用链,保存着调用状态。洋葱模型: 调用过程像剥洋葱一样,从外层进入,到达核心(目标方法),再从内层一层层返回。原创 2025-06-30 14:25:55 · 989 阅读 · 0 评论 -
面试官:Spring 是在什么时候、在哪里为符合条件的 Bean 创建代理对象的?
因为在这个时间点,原始的目标 Bean 已经是一个完整、可用的对象了。它的所有依赖都已注入,所有初始化配置都已完成。这时对它进行“包装”(创建代理)是最安全、最合适的时机。When (时间点): 在 Bean 生命周期的初始化阶段之后,通过的方法。Where (代码位置): 在类(由注册)的方法中,该方法会判断是否需要创建代理,并在需要时调用方法来完成创建。所以,任何脱离了 Spring Bean 生命周期管理的操作(比如手动new。原创 2025-06-30 09:34:48 · 1580 阅读 · 0 评论 -
Spring AOP 的源码流程是怎样的?
我会将整个流程分解为几个关键阶段,并指出每个阶段的核心类和方法。Spring AOP 的所有操作都发生在 Bean 的创建和初始化过程中。其核心的钩子是 接口,它允许我们在 Bean 初始化前后对其进行干预和“包装”。整个流程可以概括为:入口: 核心角色: 这个阶段发生在每个 Bean 实例化并完成属性填充之后,初始化方法(如 或 )调用之前或之后。关键方法: 阶段三:寻找匹配的通知 (Advisors)在 方法中,最关键的一步是为当前的 Bean 找到所有可以应用的“增强器”(在源码中称为原创 2025-06-29 12:29:19 · 822 阅读 · 0 评论 -
@Cacheable 等缓存注解是不是也用到了 AOP?
注解AOP 实现方式 (简化理解)是否执行目标方法?@Cacheable@Around:查缓存 -> (命中)短路返回/ (未命中) 执行并存入缓存不一定@CachePut@Around执行方法-> 将结果更新到缓存总是执行执行方法-> 从缓存中删除条目总是执行所以,Spring 的声明式缓存是 AOP 的实践之一。它通过 AOP 将复杂的、与业务无关的缓存管理逻辑完全分离,让开发者只需关注业务本身,极大地提高了代码的可读性和可维护性。原创 2025-06-29 11:47:58 · 1112 阅读 · 0 评论 -
Spring Security 的方法级权限控制是如何利用 AOP 的?
核心技术:Spring AOP 的前置通知或环绕通知。关键角色: AOP 功能的“总开关”。代理对象 (Proxy):拦截方法调用。: 实现了具体的安全检查逻辑。: 提供当前用户的认证和权限信息。工作流程代理拦截:调用被代理对象拦截。权限检查:在目标方法执行前,拦截器根据注解和当前用户权限进行决策。放行或中断:如果权限足够,则执行业务方法;如果不足,则直接抛出异常,中断执行。原创 2025-06-28 16:20:43 · 739 阅读 · 0 评论 -
Spring 的声明式事务 (@Transactional) 是如何通过 AOP 实现的?
核心技术:Spring AOP 的环绕通知 (@Around。关键角色代理对象 (Proxy):拦截方法调用。事务拦截器 (Transaction Interceptor):实现了具体的事务管理逻辑。事务管理器 (PlatformTransactionManager):执行真正的事务操作(开启、提交、回滚)。工作流程代理拦截:调用被代理对象拦截。事务开启:在目标方法执行前,根据配置开启事务。业务执行:调用原始目标对象的业务方法。事务提交/回滚。原创 2025-06-27 09:48:44 · 1201 阅读 · 0 评论 -
AOP 在 Spring 框架中的实际应用有哪些?
Spring 功能核心注解AOP 实现方式 (简化理解)声明式事务@Around:开启事务 -> 执行方法 -> 提交/回滚方法级安全@Before:检查权限 -> 允许/拒绝执行声明式缓存@Cacheable@Around:查缓存 -> (命中)返回 / (未命中)执行并存入缓存异步执行@Async@Around:将方法调用任务提交到线程池并立即返回重试机制@Retryable@Around:在try-catch循环中调用目标方法。原创 2025-06-26 17:51:06 · 1006 阅读 · 0 评论 -
Spring AOP 只是借鉴了 AspectJ 的注解和切点表达式吗?
答案:不完全是我们可以从两个层面来分析 :下面我们来详细解析这两个层面。这是我们日常开发中最常接触到的模式。借鉴了什么?底层实现是什么?这才是体现两者关系深度的地方。Spring 框架提供了一种机制,可以让你在 Spring 应用中直接使用 AspectJ 的织入 (Weaving) 能力,而不仅仅是它的注解。这通常通过加载时织入 (Load-Time Weaving, LTW) 来实现。加载时织入是指,在 JVM 的类加载器(ClassLoader)加载 文件时,AspectJ 的一个特殊代理(Agen原创 2025-06-26 17:38:45 · 751 阅读 · 0 评论 -
Spring AOP 和 AspectJ 有什么区别和联系?
首选 Spring AOP (95% 的场景)如果你的项目是基于 Spring 的,并且你只需要实现一些常见的横切关注点,如日志记录、声明式事务、安全检查、性能监控等,那么 Spring AOP 是你的最佳选择。它足够简单、强大,并且与生态系统完美集成。考虑 AspectJ (5% 的特殊场景)需要更强的能力:当你需要增强字段访问(例如实现数据脱敏)、构造函数(例如监控对象创建)或增强第三方库中不受 Spring 管理的代码时。追求极致性能。原创 2025-06-26 09:42:52 · 740 阅读 · 0 评论 -
Spring AOP 中有多个切面时执行顺序是怎样的?
使用@Order(整数)或实现Ordered接口来控制多个切面之间的执行顺序。@Order的值越小,优先级越高。高优先级的切面像洋葱一样包裹低优先级的切面。这意味着高优先级切面的前置逻辑先执行后置逻辑后执行。同一个切面内的通知顺序是固定的,无法通过@Order改变。原创 2025-06-25 18:03:34 · 1144 阅读 · 0 评论 -
AOP 失效的场景有哪些?为什么会失效?
失效场景根本原因方法内部自调用 (this.xxx()调用绕过了代理对象,直接在目标对象内部发生。非public方法Spring AOP 的设计规范,默认只拦截public方法。final方法或final类CGLIB 基于继承,无法重写final方法或继承final类。切点表达式错误AOP 框架根据表达式找不到匹配的方法。手动new对象对象脱离了 Spring 容器的管理,无法被代理。原创 2025-06-25 10:16:31 · 1836 阅读 · 0 评论 -
Spring AOP 如何在通知中获取目标方法的参数和返回值?
需求使用哪种通知如何实现备注获取参数@Before@After@Around注入JoinPoint,调用getArgs()方法。通用且简单。获取返回值使用returning属性将返回值绑定到通知方法的参数上。推荐,意图清晰,专门用于处理返回结果。获取并修改返回值@Around调用捕获返回值,然后处理或返回一个新的值。功能最强大,但需要手动管理方法执行流程。原创 2025-06-25 09:51:15 · 785 阅读 · 0 评论 -
Spring AOP 如何获取连接点的详细信息?
要获取连接点信息,在通知方法的参数中声明JoinPoint(或@Around中的用于获取方法签名相关信息(方法名、类名)。用于获取方法参数。获取原始目标对象,获取代理对象。只有@Around中的才有proceed()方法,用于控制目标方法的执行,并可以修改参数。原创 2025-06-24 10:19:53 · 466 阅读 · 0 评论 -
Spring AOP Pointcut 表达式的语法是怎样的?(execution(...) 是最常用的,还有哪些
指示符作用优点execution最核心、最常用,匹配方法的完整签名。最精确,控制粒度最细。within匹配指定包或类中的所有方法。语法简单,适合按模块划分。匹配持有指定注解的方法。解耦性最好,通过注解驱动AOP,业务代码无侵入。@within@target匹配持有指定注解的类中的所有方法。适合对整个类别的Bean进行增强。args@args根据方法的参数类型或参数注解来匹配。适合处理特定类型的数据流。**&&, `!`**在实际开发中,execution和是使用频率最高的两种方式。原创 2025-06-24 10:09:55 · 873 阅读 · 0 评论 -
如何通过注解 (@AspectJ风格) 来定义一个切面、切点和通知?
Aspect@Aspect: 告诉 Spring AOP 框架,这个类是一个切面。@Component: 将这个切面类注册为 Spring 容器中的一个 Bean,这样 Spring 才能找到并管理它。这个注解必不可少!import org/*** 这是一个日志切面* 1. 使用 @Aspect 声明它是一个切面* 2. 使用 @Component 让 Spring 容器发现并管理它// 这里将包含切点和通知的定义 }/*** 这是一个日志切面。原创 2025-06-23 19:57:36 · 776 阅读 · 0 评论 -
如何在 Spring 中使用 AOP?
加依赖加注解启用写切面类@Aspect@Component在切面里定义切点@Pointcut) 和通知@Before@Around等)。通过这种方式,我们的业务代码()和横切关注点(日志逻辑)实现了完美的解耦,使得代码更加清晰、可维护性更高。原创 2025-06-23 17:32:22 · 1236 阅读 · 0 评论 -
Spring 在什么情况下会选择 JDK 动态代理,什么情况下会选择 CGLIB?这个选择可以手动配置吗?
目标对象实现了接口目标对象没有实现接口备注true(默认值)CGLIBCGLIBSpring Boot 的默认行为,强制基于类代理。falseJDK 动态代理CGLIB传统 Spring 的行为,优先基于接口代理。理解这个配置项对于排查 AOP 相关问题,特别是(例如,试图将代理对象强转为具体实现类而不是接口)和方法自调用失效问题,非常有帮助。原创 2025-06-23 09:44:52 · 1075 阅读 · 0 评论 -
CGLIB 代理: 它的工作原理是什么?它有什么限制?
是一个强大的、高性能的第三方代码生成库。它被广泛用于在运行时扩展 Java 类和实现 AOP。与 JDK 动态代理不同,CGLIB 的代理机制是基于继承的。当 Spring AOP 发现一个需要被代理的目标对象没有实现任何接口时,它就会自动切换到 CGLIB 来创建代理。特性描述核心技术字节码增强 (代理方式在运行时动态地继承目标类,创建其子类作为代理。最大限制无法代理final类和finalprivatestatic方法。优点无需接口即可代理,适用性更广;性能通常被认为略优于 JDK 代理。缺点。原创 2025-06-23 09:38:41 · 909 阅读 · 0 评论 -
JDK 动态代理: 它的工作原理是什么?它有什么限制?
JDK 动态代理是 Java 官方提供的一种在运行时动态创建代理对象的技术。它允许我们创建一个“替身”对象,这个替身可以在不修改原始业务代码的情况下,拦截对原始对象方法的调用,并在调用前后插入自定义的逻辑(即 AOP 中的“通知”)。特性描述核心技术Java 反射 (代理方式在运行时动态地实现目标对象的所有接口,生成代理类。最大限制目标对象必须实现接口。无法代理没有接口的普通类。优点Java 原生支持,无需引入任何第三方库。缺点必须有接口;存在一定的反射性能开销;无法强转为具体实现类。原创 2025-06-22 17:48:32 · 461 阅读 · 0 评论 -
Spring AOP 支持哪两种动态代理方式?
特性JDK 动态代理CGLIB 代理代理方式基于接口(实现共同接口)基于继承(创建子类)前提条件目标对象必须实现接口目标对象不能是 final 类性能在早期版本中,通过反射调用性能略低于 CGLIB。但在目前JDK 版本中,两者性能差距已经非常小。性能通常被认为略高,因为它直接操作字节码并调用super。Spring Boot 默认否是。原创 2025-06-22 09:11:27 · 512 阅读 · 0 评论 -
什么是动态代理?它和静态代理有什么区别?
静态代理是指代理类是在编译时就已经创建好了,它的.java源文件和.class文件是真实存在的。代理类和被代理类(目标类)通常会实现同一个接口。简单来说,就是你(开发者)需要手动为每一个需要代理的类,编写一个对应的代理类。动态代理是指代理类是在程序运行时,通过反射或字节码技术动态生成的,它的.java文件并不存在于你的项目源码中。你不需要手动编写任何代理类。你只需要编写一个通用的处理器 (Handler),这个处理器包含了你的增强逻辑。原创 2025-06-22 08:39:58 · 902 阅读 · 0 评论 -
Spring AOP 是基于什么技术实现的?
特性JDK 动态代理CGLIB核心技术Java 反射字节码增强代理方式实现目标对象的接口继承目标对象,创建其子类前提条件目标对象必须实现接口目标对象不能是 final 类,方法不能是 finalSpring Boot 默认否是 (推荐)Spring AOP 的魔法在于运行时动态代理。它通过JDK 动态代理(基于接口)或CGLIB(基于继承)来创建一个“包装”你原始对象的代理,并在这个代理中神不知鬼不觉地织入了你的横切逻辑,而这一切都无需你修改任何一行业务代码。原创 2025-06-21 14:43:47 · 884 阅读 · 0 评论 -
Spring AOP 的实现原理是什么?
特性JDK 动态代理CGLIB 代理核心技术Java 反射 (字节码增强 (Bytecode Enhancement)代理方式实现目标对象的所有接口继承目标对象,创建其子类前提条件目标对象必须实现接口目标对象不能是 final 类,方法不能是 finalSpring Boot 默认否是 (推荐)对代码影响无无理解 Spring AOP 是基于运行时动态代理这一核心原理,以及它与目标对象和代理对象的关系,是掌握 AOP 并解决类似“方法内部调用导致 AOP 失效”等问题的关键。原创 2025-06-21 11:21:59 · 800 阅读 · 0 评论 -
目标对象 (Target Object) 和 代理对象 (Proxy Object) 有什么区别?我们最终调用的是哪一个?
特性目标对象 (Target Object)代理对象 (Proxy Object)创建者开发者(你写的.java文件)Spring AOP 框架(在运行时动态生成)包含内容纯粹的、核心的业务逻辑切面逻辑(所有通知) + 一个对目标对象的引用对AOP的感知完全无感知,它是一个 POJO (Plain Old Java Object)为 AOP 而生,它的存在就是为了执行切面逻辑谁调用它代理对象在内部调用它外部调用方(如 Controller, 其他 Service)在Spring容器中。原创 2025-06-21 09:58:05 · 1125 阅读 · 0 评论 -
Spring Aop 切点 (Pointcut) 是什么?它的作用是什么?
切点 (Pointcut)是一个查询表达式,它的作用是定义“在哪里”应用通知(Advice)。连接点 (Join Point):你的程序中所有可以被拦截的“点”,就像一条河里所有的鱼。这包括方法的调用、方法的执行、字段的设置等。在Spring AOP中,连接点特指方法的执行。通知 (Advice):你想要执行的“动作”,比如日志记录、权限检查。这就像你要对鱼做的操作(比如称重、拍照、放生)。切点 (Pointcut):一个“筛选条件”或一个“渔网”,它精确地定义了你想要捕捞哪些鱼。原创 2025-06-21 08:31:13 · 953 阅读 · 0 评论 -
Spring Aop @Around (环绕通知)的使用场景
Around通知将目标方法“包裹”起来,像一个三明治一样,目标方法是中间的馅料,而@Around通知是上下的两片面包。在目标方法调用之前和之后,都可以执行自定义的逻辑,并且它拥有完全控制权,可以决定目标方法是否被执行、如何被执行,甚至可以修改参数和返回值。它就像一个拥有最高权限的“代理守卫”,不仅能在目标方法执行前后进行检查和记录,还能决定是否放行、篡改通行证(参数),甚至伪造一个结果(返回值)直接返回,让调用者以为目标方法已经执行了。@Around特性描述执行时机完全包裹。原创 2025-06-21 08:03:13 · 1629 阅读 · 0 评论 -
Spring Aop @AfterThrowing (异常通知): 使用场景
是 Spring AOP 中专门用于处理异常场景的**通知(Advice)**类型。仅在目标方法(连接点)的执行过程中抛出异常时,执行一段特定的逻辑。如果目标方法成功执行并正常返回,则该通知不会被执行。你可以把它想象成 Java语句块里的 catch部分。当try块中的代码出现问题时,catch块就会被激活。的行为与此非常相似。特性描述执行时机仅在目标方法执行过程中抛出异常时。核心用途异常日志记录系统告警、失败统计。能否访问异常可以,通过throwing属性指定接收参数,获取异常对象。能否处理异常。原创 2025-06-20 17:13:33 · 1283 阅读 · 0 评论 -
Spring AOP @AfterReturning (返回通知)的使用场景
是 Spring AOP 中一个非常重要的通知(Advice类型。仅在目标方法(连接点)成功执行并正常返回之后,执行一段特定的逻辑。如果目标方法在执行期间抛出异常,则该通知不会被执行。它就像是为一次成功的任务举行的“庆功会”或“成果验收”。只有当任务圆满完成(方法正常返回),这个后续步骤才会被触发。特性描述执行时机仅在目标方法成功执行并正常返回后。核心用途对方法的返回结果进行后续处理,如日志记录、结果缓存、触发异步任务。能否访问返回值可以,通过returning属性指定接收参数。能否修改返回值不可以。原创 2025-06-20 14:06:17 · 1080 阅读 · 0 评论 -
Spring Aop @After (后置通知)的使用场景?
After是 Spring AOP 中的另一种通知(Advice)类型,通常被称为“后置通知”或“最终通知”。无论目标方法是正常执行完成,还是在执行过程中抛出了异常,@After通知中的代码总是会在目标方法执行之后被执行。最经典的类比就是 Java 中的语句块里的 finally部分。@After的行为和finally块的行为几乎一模一样。@After特性描述执行时机无论成功或失败,总是在目标方法执行之后执行。核心用途资源释放上下文清理、最终日志记录等收尾工作。行为类似Java 的。原创 2025-06-19 15:11:04 · 870 阅读 · 0 评论 -
Spring AOP @Before (前置通知): 在目标方法执行前做什么?
Before是 Spring AOP 中的一种**通知(Advice)**类型。在“连接点(Join Point)”,也就是目标方法被执行之前,执行一段特定的逻辑代码。你可以把它想象成一个“门卫”。在有人(调用方)要进入一个重要的房间(目标方法)之前,门卫(@Before通知)会先执行一系列检查或准备工作,比如核对身份、记录来访时间等。@Before特性描述执行时机在目标方法被调用之前执行。核心用途日志记录、权限校验、参数校验、数据准备等预处理工作。控制能力不能直接阻止目标方法执行,也不能。原创 2025-06-19 15:02:49 · 1461 阅读 · 0 评论 -
Spring AOP中通知 (Advice) 是什么?
通知 (Advice)是切面(Aspect)的具体动作,它封装了你希望在目标方法执行时插入的代码逻辑。简单来说,如果切面(Aspect)回答了“我要对谁(Pointcut)做什么(Advice)”,那么通知(Advice)就是那个具体的“做什么通知类型定义了“何时”定义了“做什么”关键特征@Before方法执行前前置处理逻辑(如参数校验)无法阻止方法执行,无法获取返回值@After方法执行后资源清理等finally型逻辑无论成功或异常都会执行方法成功返回后针对成功结果的后处理。原创 2025-06-19 14:50:02 · 768 阅读 · 0 评论 -
连接点 (Join Point) 是什么?在 Spring AOP 中,连接点只能是什么?
连接点 (Join Point)是指在程序执行过程中,可以被切面(Aspect)的通知(Advice)所织入的所有可能的时间点或事件点。你可以把你的整个应用程序的执行流程想象成一条长长的时间线。一个方法被调用。一个方法正在执行。一个对象被创建(构造函数被调用)。一个类的字段被读取或修改。一个异常被抛出。所有这些在程序执行流程中可以被精确定义的“点”,都是连接点 (Join Point)。它们是 AOP 框架能够“插入”逻辑的候选位置。比喻:连接点 (Join Point)原创 2025-06-18 11:46:07 · 698 阅读 · 0 评论 -
切面 (Aspect) 是什么?它由什么组成?
一句话概括:切面 (Aspect)是一个模块,它封装了横跨应用程序中多个模块的通用功能(横切关注点)。假设你的应用程序有很多业务模块,比如用户管理、订单管理、商品管理等。现在,你想为这些模块的每个业务方法日志记录:在方法开始执行前记录入参,在方法结束后记录出参。权限验证:在方法执行前检查当前用户是否有权限操作。事务管理:在方法开始前开启事务,在方法成功后提交,在发生异常时回滚。性能监控:记录每个方法的执行耗时。原创 2025-06-18 11:34:17 · 1128 阅读 · 0 评论 -
面试官:能否用一个生动的比喻来描述 AOP?
我们用一个的比喻来描述 AOP。原创 2025-06-17 16:58:08 · 1626 阅读 · 1 评论 -
AOP 解决了软件开发中的什么痛点?
想象一下你正在开发一个业务系统,比如一个用户管理服务。:添加用户:更新用户:删除用户:查找用户现在,除了核心的增删改查逻辑,你还需要为这些方法增加一些通用但非核心日志记录:在每个方法开始执行前记录入参,结束后记录出参和耗时。权限校验:在执行方法前,检查当前操作者是否有权限。事务管理:在方法开始前开启数据库事务,方法成功结束后提交,出现异常则回滚。性能监控:记录每个方法的执行时间。这些功能(日志、权限、事务)就是所谓的“横切关注点”。为什么叫“横切”?因为它们像一把刀,横向地切入。原创 2025-06-17 10:31:10 · 662 阅读 · 0 评论 -
在没有 AOP 的情况下,我们会遇到什么问题?
代码层面:大量的代码重复和代码臃肿,核心逻辑与非核心逻辑混杂在一起。维护层面维护成本极高,需求变更或 Bug 修复牵一发而动全身,且极易出错。设计层面:严重违反了单一职责、开闭原则等重要的软件设计原则,导致系统高耦合、低内聚,难以扩展和重用。AOP 的出现,正是为了将这些散落在各处的“横切关注点”进行优雅地分离、封装和重用,从而根治上述顽疾。它让程序员可以专注于核心业务逻辑的开发,把通用功能交给“切面”去统一处理。原创 2025-06-17 10:14:11 · 747 阅读 · 0 评论 -
为什么需要 AOP?
AOP 不是一门新的技术,而是一种编程思想,它帮助我们解决了传统面向对象编程 (OOP) 难以处理的“横切关注点”问题。一句话总结:AOP 让我们能够将散布在应用中多个角落的通用功能(如日志、事务、安全)聚合到一个地方进行统一管理,从而让业务代码更纯粹、系统模块化更清晰、代码可维护性和复用性更高。它就像给你的程序装上了一个“插件系统”,你可以在不修改任何一行核心业务代码的情况下,动态的为系统添加或移除功能。Spring 框架的声明式事务 () 就是 AOP 最经典的应用。原创 2025-06-17 10:02:22 · 889 阅读 · 0 评论
分享