AOP

Spring AOP

  • OOP:Object-Oriented Programming,面向对象编程;AOP:Aspect-Oriented Programming,面向切面编程
  • Advisor:spring 自己的 AOP 组件;AspectJ :三方实现的 AOP 组件
  • 原理是对目标 bean 创建代理对象,达到增强目的
    • 如果目标 bean 实现了接口,就用 JDK 动态代理;如果没有,就用 CGLIB
    • 如果有代理多次(多个切面类)可以通过 @Order 指定切面顺序,数值越小,越先生成代理类
  • 两种连接点,分别是 JoinPointProceedingJoinPoint,适用于不同的通知
    • JoinPoint:获取连接点信息,比如方法、参数、目标对象等,可用于 @Before@After@AfterReturning
    • ProceedingJoinPoint:是 JointPoint 的子接口,额外提供 proceed() 来执行目标方法,仅用于 @Around
  • 声明式事务 @Transactional 注解底层就使用 AOP 实现事务提交回滚的

AspectJ VS Advisor

说人话 AspectJ 更强大、性能更好、可以不依赖 spring;总结就是:简单场景使用 Advisor,复杂场景使用 AspectJ。下面是两者详细对比

AspectJ Advisor
定义 AspectJ 是一个完整的 AOP 框架,支持面向切面编程的编译时和运行时特性。 Advisor 是 Spring AOP 的一个概念,表示一个切面中的通知和切入点的组合。
编程模型 提供了丰富的语言支持,包括注解、XML 配置和代码注入。 主要通过注解(如 @Before, @After)或 XML 配置来定义。
切面实现 可以在编译时、类加载时或运行时进行织入,支持复杂的切点表达式。 主要通过 Spring 容器在运行时使用动态代理实现,切点表达式相对简单。
织入方式 支持编译时织入、类加载时织入和运行时织入。 仅支持运行时织入,通常使用 Java 动态代理或 CGLIB 代理。
切点表达式 使用 AspectJ 表达式,支持更复杂的匹配规则。 使用 Spring AOP 的切点表达式,功能相对有限。
应用范围 可用于任何 Java 应用,包括独立 Java 程序和 Spring 应用。 主要用于 Spring 应用中,与 Spring 生态系统紧密集成。
支持的通知类型 支持多种通知类型,如 @Before, @After, @Around, @AfterReturning, @AfterThrowing 支持 Before, After, Around 和其他通知类型,通常由 Advisor 定义。
性能 AspectJ 的性能较高,因为它可以在编译时进行优化。 Spring AOP 的性能相对较低,因为它依赖于运行时代理。
易用性 对于初学者来说,学习曲线可能较陡峭。 更加简单直观,易于上手。

AOP 概念

概念 定义 说人话
切面 (Aspect) 定义了一个横切关注点的模块,包含通知和切入点。 就是我们定义的切面类
连接点 (Join Point) 程序执行过程中一个可以插入通知的点,例如方法调用、方法执行、对象创建等。 目标对象所有方法
切入点 (Pointcut) 定义在哪些连接点上应用通知的规则或表达式,决定通知的应用范围。 目标对象被增强的方法
通知 (Advice) 在连接点上执行的行为,分为前置通知、后置通知、返回通知、异常通知和环绕通知。
织入 (Weaving) 将切面与目标对象结合的过程,发生在编译时、类加载时或运行时。 将切点和通知组合的过程
目标对象 (Target Object) 被切面影响的对象,通常是包含业务逻辑的类。

通知

通知类型 描述
前置通知 (Before) 在连接点执行之前运行的通知(通知中如果 return,目标方法不会执行)。
后置通知 (After) 在连接点执行之后运行的通知,通常在连接点成功或失败后都会执行。
返回通知 (After Returning) 在连接点成功完成后执行的通知,可以访问连接点的返回值(目标方法执行不能发生异常)。
异常通知 (After Throwing) 在连接点抛出异常时执行的通知,可以访问异常信息。
环绕通知 (Around) 在连接点执行之前和之后都可以执行的通知,允许控制连接点的执行,能够选择不执行连接点的方法(这是一个四合一通知)。
posted @   CyrusHuang  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示