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

Spring AOP 详解:面向切面编程的核心与实践

1. 什么是 AOP?

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在将横切关注点(如日志记录、事务管理、权限校验等)从业务逻辑中分离出来,以提高代码的模块化和可维护性

在 Spring 框架中,AOP 通过代理模式实现,允许开发者在不修改原有代码的情况下,动态地将额外行为织入到目标方法中


2. AOP 的核心概念

  • Aspect(切面):横切关注点的模块化实现。例如,日志记录、事务管理等。

  • Join Point(连接点):程序执行过程中的某个点,如方法调用或异常抛出。

  • Advice(通知)

    :在连接点执行的动作。Spring 支持以下通知类型:

    • Before:在目标方法执行前执行。
    • After:在目标方法执行后执行,无论是否抛出异常。
    • AfterReturning:在目标方法成功返回后执行。
    • AfterThrowing:在目标方法抛出异常后执行。
    • Around:环绕目标方法执行,可以控制是否执行目标方法(最重要
      • 环绕通知必须依赖形参 ProceedingJoinPoint 才能实现对原始方法的调用,进而实现原始方法调用钱前后同时添加通知
      • 通知中如果未使用ProceedingJoinPoint对原始方法进行调用将跳过原始方法的执行
      • 对原始方法的调用可以不接收返回值,通知方法设置成 void即可,如果接收返回值,必须设定为 Object类型
      • 原始方法的返回值如果是 void类型,通知方法的返回值类型可以设置成 void,也可以设置成 Object
      • 由于无法预知原始方法运行是否会抛出异常,因此环绕通知方法必须抛出 Throwable对象
  • Pointcut(切点):用于匹配连接点的表达式,决定哪些方法会被拦截

  • Weaving(织入):将切面应用到目标对象并创建代理对象的过程

  • 目标对象(Target):被代理的类

  • 代理(Proxy):AOP 通过动态代理来增强目标对象


3. Spring AOP 的实现方式

Spring AOP 支持两种实现方式:

  • 基于代理的 AOP:通过 JDK 动态代理或 CGLIB 生成代理对象
  • 基于注解的 AOP:使用 @Aspect 注解定义切面

4. 代码示例

以下是一个基于注解的 Spring AOP 示例,实现日志记录功能。

4.1 添加依赖

pom.xml 中添加 Spring AOP 依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.1.14</version>
    </dependency>

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.22.1</version>
    </dependency>
    
     <!-- Spring Test -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>6.1.14</version>
        <scope>test</scope>
    </dependency>

    <!-- JUnit 5 -->
    <dependency

相关文章:

  • 网络变压器(以太网隔离变压器)在千兆以太网中扮演着信号传输、电气隔离和抗干扰的关键角色。以下是其在不同领域的典型应用案例及作用分析:
  • coze生成的工作流,发布后,利用cmd命令行执行。可以定时发日报,周报等。让他总结你飞书里面的表格。都可以
  • Java中的泛型类 --为集合的学习做准备
  • AI时代保护自己的隐私
  • 【开发心得】SpringBoot Oauth2授权登录
  • 每日一题----------类变量
  • 靶场之路-Kioptix Level-5
  • path 路径模块
  • 【Java】Stream API
  • 数据集笔记:新加坡LTA MRT 车站出口、路灯 等位置数据集
  • 开源绝版经典小游戏合集
  • 第三十四:6.4.【v-model】
  • Kali换源
  • 【Linux高级IO】多路转接(poll epoll)
  • 第49天:Web开发-JavaEE应用SpringBoot栈模版注入ThymeleafFreemarkerVelocity
  • Oracle 认证为有哪几个技术方向
  • python中如何组织项目工程文件
  • 一文学会Volatile关键字
  • DeepSeek 开源周:第六天的“One More Thing” – DeepSeek-V3/R1 推理系统的概述
  • 【Web Cache Deception简介】
  • 网站怎么做下载网页代码吗/石家庄seo排名公司
  • 怎么做伪静态网站/自动app优化下载
  • 太原网站制作哪家好/最近新闻大事件
  • 一个网站的建设步骤是/友妙招链接
  • 建网站免费/怎么让百度收录我的网站
  • 贵州小城镇建设网站/seo点击排名