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

Spring AOP核心原理与实战指南

一.AOP概述

        AOP为Aspect Oriented Programming的缩写,是面向切面编程,是OOP的延续,是Java中的一个重要内容.利用AOP可以对业务逻辑和非业务逻辑进行隔离,从而使得各个部分之间的耦合度降低,提高代码重用性.

核心原理:使用动态代理(代理对象)的方式在执行方法前后或者出现异常时加入相关逻辑,我们只需配置调用时间

使用案例:事务处理,权限判断,日志打印等

1.连接点:类中可以被增强的方法,简单点来说就是可以加入非业务逻辑的方法

2.切入点:类中有很多方法可以被增强,但实际只有个别方法会被增强,那么被增强的方法就称为切入点

3.通知:通知是指一个切面在特定的连接点要做的事情

4.目标:代理的目标对象(连接点,切入点所在的类)

5.代理:向目标对象应用通知时所创建的代理对象

二.Spring框架对AOP的实现

        AOP是Java中的一种重要的编程思想,很多框架都对AOP进行了实现,Spring就是其中之一,可以完成面向切面编程

        AspectJ是一个基于JAVA语言的AOP框架,支持注解式开发,所以Spring将AspectJ引入到了自己的框架中

要在Spring框架中使用AspectJ框架只需要导入相关jar

<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.2.RELEASE</version>
</dependency>

然后在Spring框架中的配置文件中启动AspectJ支持

<aop:aspectj-autoproxy />

三.通知类型代码示例

*任意返回值 方法地址(参数 ..代表任意参数)

1.前置通知(@Before):在目标方法之前执行

@Before("execution(* springpro.service.BookService.addBook())")public void savelog(){System.out.println("保存日志");}

2.后置通知(@After):在目标方法之后执行,即使方法出现异常也会执行

 @After("execution(* springpro.service.BookService.addBook())")public void savelog1(){System.out.println("保存日志");}

3.返回通知(@AfterReturning):在方法指向完成之后执行,方法出现异常则不执行

@AfterReturning("execution(* springpro.service.BookService.addBook())")public void savelog3(){System.out.println("保存日志");}

4.异常通知(@AfterThrowing):在方法出现异常时执行

@AfterThrowing(value = "execution(*springpro.service.BookService.addBook())",throwing = "e")public void commonException(Throwable e){System.out.println(e.getMessage());}

这里需要注意的是value用于定义切点,throwing用于将目标方法抛出的异常绑定到通知方法的参数,这里参数使用Throwable是因为它是Exception和Error的超类,提升代码扩展性

5.环绕通知(@Around):可以同时执行其他四个通知

 @Around("execution(* springpro.service.BookService.addBook())")public void around(ProceedingJoinPoint joinPoint){try {System.out.println("前置通知");            Object[] args = joinPoint.getArgs();//获取目标方法的参数joinPoint.proceed();//调用我们自己的目标方法System.out.println("返回通知");} catch (Throwable e) {System.out.println("异常通知");throw new RuntimeException(e);}System.out.println("后置通知");}

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

相关文章:

  • 任务十一 搜索页面开发
  • Incredibuild 新增 Unity 支持:击破构建时间过长的痛点
  • AutoSarAP状态管理的状态机能否理解成C++的类?
  • 电视系统:开启视听新时代
  • 一个多功能的文件分享工具--zdir手动部署教程
  • 垂直领域大模型构建:法律行业“类ChatGPT”系统的训练与落地
  • el-table合并单元格
  • 接口自动化测试大全(python+pytest+allure)
  • Angular极速入门
  • 【CUDA教程--3】通过简单的矩阵运算入门CUDA
  • cursor+mcp-clickhouse进行数据分析
  • Spring循环依赖源码调试详解,用两级缓存代替三级缓存
  • JB4-9-任务调度
  • 网络通信基础:从数据链路层到传输层
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘paramiko’问题
  • Leetcode 3652. Best Time to Buy and Sell Stock using Strategy
  • 【20250819】mathtype的使用
  • Sklearn 机器学习 房价预估 计算房价和特征值的相关性
  • 差分约束系统SPFA判负环
  • 【自动驾驶】8月 端到端自动驾驶算法论文(arxiv20250819)
  • 决策树1.1
  • 设计模式笔记_行为型_解释器模式
  • 集成电路学习:什么是Thresholding阈值处理
  • PowerBI VS FineBI VS QuickBI实现帕累托分析
  • Go 并发入门:从 goroutine 到 worker pool
  • 用 C++ 构建高性能测试框架:从原型到生产实战指南
  • Python 项目里的数据预处理工作(数据清洗步骤与实战案例详解)
  • 在线客服系统访客表的设计与实现-增加最新消息字段
  • Task01: CAMEL环境配置及第一个Agent
  • Kubernetes Ingress实战:从环境搭建到应用案例