当前位置: 首页 > news >正文

结合项目对AOP的实践和理论讲解-AOP八股

1. 什么是 AOP?

AOP(Aspect-oriented Programming,面向切面编程)是一种设计思想,旨在通过切面技术为业务主体添加额外的通知(Advice),对声明为“切点”(Pointcut)的代码块进行统一管理和装饰。

  • 它是对面向对象编程(OOP)的补充:OOP的核心是类(class),AOP的核心是切面(Aspect)。
  • 适用场景:将与核心业务关联较弱的通用功能(如日志、权限校验、性能监控等)抽离并统一实现,降低代码耦合度,提高可重用性。
  • 简单理解:在方法执行前、执行后、异常时等时机插入通用操作,且不影响原业务逻辑的运行(如技术派中通过AOP记录接口调用耗时)。

2. AOP 的核心概念?

文档中明确提到AOP的5个关键术语:

  1. 横切关注点:从多个方法中抽取的同一类非核心业务(如所有接口的日志记录)。
  2. 切面(Aspect):对横切关注点的封装类,通常用@Aspect注解定义(如技术派中的MdcAspect类)。
  3. 通知(Advice):切面要完成的具体工作,包括5种类型(文档中详细列举):
    • @Before:目标方法执行前执行
    • @After:目标方法执行后执行
    • @AfterReturning:目标方法返回后执行
    • @AfterThrowing:目标方法抛出异常后执行
    • @Around:包裹目标方法,在其执行前后分别执行
  4. 连接点(JoinPoint):通知应用的时机(如接口方法被调用时)。
  5. 切点(Pointcut):通知的应用范围,通过切点表达式定义(如技术派中“所有被@MdcDot注解的方法”)。

3. AOP 有哪些环绕方式?

即通知的5种类型(文档中“通知”部分明确说明):

  • @Before:前置通知,目标方法执行前触发。
  • @After:后置通知,目标方法执行后(无论是否异常)触发。
  • @AfterReturning:返回后通知,目标方法正常返回后触发。
  • @AfterThrowing:异常通知,目标方法抛出异常后触发。
  • @Around:环绕通知,完全包裹目标方法,可在其执行前后、返回值或异常时自定义逻辑(技术派的MdcAspect中使用@Around记录方法耗时)。

4. 平时怎么使用 AOP?

结合文档中技术派的实践,常见用法如下:

  1. 日志记录:通过AOP拦截接口方法,记录调用参数、返回值、执行耗时等(如MdcAspect记录接口耗时并生成traceId)。
  2. 统一上下文管理:利用MDC(映射诊断上下文)在多线程环境中传递traceId,便于分布式系统追踪请求链路。
  3. 动态功能增强:如技术派中通过@MdcDot注解标记需要监控的方法,AOP自动为其添加耗时统计和日志输出,无需修改原业务代码。

5. Spring AOP 和 AspectJ AOP 的区别?

  • 实现方式
    • Spring AOP 基于动态代理(JDK动态代理或CGLIB)实现,运行时生成代理对象,仅支持方法级别的切点。
    • AspectJ 是独立的AOP框架,基于编译期织入(编译时修改字节码)或类加载期织入,支持字段、构造器、方法等更细粒度的切点。
  • 依赖
    • Spring AOP 是Spring框架的一部分,无需额外依赖(但使用@Aspect需引入AspectJ的注解包)。
    • AspectJ 需要单独引入依赖,且功能更全面。
  • 适用场景
    • Spring AOP 适合简单的方法级切面(如日志、权限),与Spring生态无缝集成(技术派中使用的是Spring AOP)。
    • AspectJ 适合复杂场景(如字段拦截),但配置和学习成本更高。

6. JDK 动态代理和 CGLIB 代理?

两者是Spring AOP实现动态代理的两种方式:

  • JDK 动态代理
    • 基于接口实现,只能代理实现了接口的类。
    • 原理:通过java.lang.reflect.Proxy生成代理类,代理类实现目标接口,并重写方法,织入增强逻辑。
  • CGLIB 代理
    • 基于继承实现,可代理未实现接口的类(通过生成目标类的子类)。
    • 原理:通过字节码技术生成目标类的子类,重写父类方法,织入增强逻辑。
  • 技术派中,Spring AOP默认优先使用JDK动态代理;若目标类未实现接口,则自动切换为CGLIB代理。

通过技术派的实践可以看出,AOP的核心价值在于“解耦”——将通用功能与业务逻辑分离,既保证代码简洁,又便于统一维护。

http://www.dtcms.com/a/333835.html

相关文章:

  • 第十四节:物理引擎集成:Cannon.js入门
  • Windows Server Core智能调优
  • 智能体开发实战:用Deepseek做一个生成思维导图的智能体
  • SSH协议的GIT转换
  • 访问者模式C++
  • Day55 Java面向对象09 super关键字详解
  • MySQL 高效查询五虎将——分页、排序、分组、去重、聚合函数实战手册
  • 解决HFSS许可证激活错误的实用方法
  • QT开发中QString是怎么转char*类型的
  • 轴机械臂cad【7张】三维图+设计说明书
  • 子进程资源回收与线程相关概念
  • 机器视觉助力柔性屏贴合工艺升级,精度可达0.01mm
  • 文章数据发布到苹果CMS(MacCMS)网站技巧
  • 深入理解Transformer:从训练机制到长文本处理的核心问题
  • Erlang notes[2]
  • Fastadmin后台列表导出到表格
  • 从理论到实战:KNN 算法与鸢尾花分类全解析
  • [Pyro概率编程] 推理算法Infer | 随机变分推断SVI | MCMC采样机制
  • linux 设备驱动的分层思想
  • MySQL的学习笔记
  • Python 常用库速查手册
  • 小红书帖子评论的nodejs爬虫脚本
  • C++编程学习(第24天)
  • 数据结构与算法p4
  • Eclipse:关闭项目
  • 【121页PPT】锂膜产业MESERP方案规划建议(附下载方式)
  • Git、JSON、MQTT
  • ramdisk内存虚拟盘(一)——前世今生
  • 嵌入式第二十九课!!!回收子进程资源空间函数与exec函数
  • SurperSet柱状图排序失效问题解决