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

Spring (八)AOP-切面编程的使用

目录

实现步骤:

1 导入AOP依赖

2 编写切面Aspect

3 编写通知方法

4 指定切入点表达式

5 测试AOP动态织入


图示:

实现步骤:

1 导入AOP依赖

        <!-- Spring Boot AOP依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2 编写切面Aspect

@Aspect         // 标记为切面类
@Component      // 由Spring容器管理
public class LogAspect {
    // 切入点表达式和通知方法在此定义
}

3 编写通知方法

通知方法(Advice) 是面向切面编程(AOP)中的核心概念,表示在目标方法(或切入点)的某个执行阶段插入的增强逻辑。通俗来说,就是“在某个地方(切入点)做某件事(增强逻辑)”。

通知方法的类型

Spring AOP 提供了5种通知类型,对应不同的执行时机:

注解执行时机典型场景
@Before目标方法执行前参数校验、权限验证
@After目标方法执行后(无论是否抛出异常)资源清理、日志记录
@AfterReturning目标方法正常返回后(无异常时执行)记录结果、缓存数据
@AfterThrowing目标方法抛出异常后异常处理、告警通知
@Around包围目标方法(可自定义方法执行前后逻辑,甚至阻止方法执行)性能监控、事务管理


代码实现:

package org.example.spring02.aspect;

import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {


    public void logStart() {
        System.out.println("【切面-日志】开始");
    }



    public void logEnd() {
        System.out.println("【切面-日志】结束");
    }


    public void logReturn() {
        System.out.println("【切面-日志】返回");
    }


    public void logException() {
        System.out.println("【切面-日志】异常:");
    }


}

4 指定切入点表达式

作用:通过表达式定义哪些方法需要被拦截。
语法结构

execution([访问权限] 返回类型 包名.类名.方法名(参数类型) [异常类型])

代码实现:

精确指定接口的路径:

    @Before("execution(int org.example.spring02.MathMethod.MathCalculator.*(..))")
    public void logStart() {
        System.out.println("【切面-日志】开始");
    }
package org.example.spring02.aspect;

import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {

    @Before("execution(int *(int,int))")
    public void logStart() {
        System.out.println("【切面-日志】开始");
    }


    @After("execution(int *(int,int))")
    public void logEnd() {
        System.out.println("【切面-日志】结束");
    }

    @AfterReturning("execution(int *(int,int))")
    public void logReturn() {
        System.out.println("【切面-日志】返回");
    }

    @AfterThrowing("execution(int *(int,int))")
    public void logException() {
        System.out.println("【切面-日志】异常:");
    }


}

5 测试AOP动态织入

package org.example.spring02;

import org.example.spring02.MathMethod.MathCalculator;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class AopTest {

    @Autowired
    MathCalculator mc;

    @Test
    public void test01() {
        int add = mc.add(1, 2);
        System.out.println(add);
    }
    
}

相关文章:

  • 前端面试题 口语化复述解答(从2025.3.8 开始频繁更新中)
  • 动静态库链接生成和使用以及认识ELF文件
  • FPGA 实验报告:四位全加器与三八译码器仿真实现
  • 【NLP 31、文本匹配任务 —— 深度学习】
  • 跟着 Lua 5.1 官方参考文档学习 Lua (11)
  • 线性代数之矩阵特征值与特征向量的数值求解方法
  • 2022年《申论》第二题(河北A卷)
  • Java高频面试之集合-07
  • 剖析Manus:AI领域的创新先锋还是虚假泡沫?
  • 【leetcode hot 100 141】环形链表
  • 解锁AIGC新时代:通义万相2.1与蓝耘智算平台的完美结合引领AI内容生成革命
  • 掌握Linux基础:从Shell提示符到文件管理的全面指南
  • JavaWeb-Servlet6 入门
  • 低纹波高效率DCDC电源芯片ASP4644技术解析
  • 行为模式---责任链模式
  • window 11亲测NodeMCU-8266 开发板+Micropython点灯实验
  • Feign 核心规则与最佳实践:避免入坑指南
  • 正向代理与反向代理
  • Redis- 哨兵
  • Restful 接口设计规范
  • 用j2ee作的网站/免费自己建网站
  • wordpress tags页面/简述如何优化网站的方法
  • 建设政府网站多少钱/关键词排名优化公司哪家好
  • 武汉便宜网站建设/百度云网盘
  • 江门网站推广/怎么发帖子做推广
  • seo自己做网站吗/电子商务培训