Spring中通知是什么

面向切面编程 这个切面是哪个面

面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,它通过切面(Aspect)来分离横切关注点(Cross-cutting Concerns)和核心业务逻辑。

在AOP中,切面是对横切关注点的抽象和封装。横切关注点是指那些与核心业务逻辑无关,但又散布在各个模块中、影响多个模块的功能或行为,如日志记录、事务管理、安全检查等。切面通过定义通知(Advice)和切点(Pointcut)来描述横切关注点。

通知(Advice)定义了切面在何时、如何执行附加逻辑。例如,在方法执行前执行的前置通知、在方法执行后执行的后置通知、在方法抛出异常时执行的异常通知等。

切点(Pointcut)定义了切面所要应用的连接点(Join Point)。连接点是程序执行过程中能够触发切面的特定位置,如方法调用、方法执行、异常抛出等。切点表达式定义了哪些连接点符合切点的条件。

切面通过将通知和切点组织在一起,实现了对横切关注点的统一管理和重用。在Spring框架中,AOP通过代理技术和动态字节码生成实现。在运行时,Spring会根据配置将切面织入到目标对象中,从而实现横切关注点的功能。

总而言之,AOP是一种通过切面来分离横切关注点和核心业务逻辑的编程范式,切面通过定义通知和切点来描述和管理横切关注点。

Spring中通知

在Spring框架中,通知(Advice)是AOP的核心概念之一,用于定义在目标方法执行过程中需要执行的附加逻辑。通知可以在目标方法执行前、执行后或发生异常时被触发执行。

Spring框架提供了以下几种类型的通知:

  1. 前置通知(Before Advice):
    前置通知在目标方法执行之前执行,可以在此处进行一些准备工作或参数校验等操作。例如,可以在前置通知中记录日志或进行权限检查。

  2. 后置通知(After Returning Advice):
    后置通知在目标方法成功执行后执行,可以获取到目标方法的返回值,并进行一些后处理操作。例如,可以在后置通知中对返回结果进行处理或记录日志。

  3. 异常通知(After Throwing Advice):
    异常通知在目标方法抛出异常时执行,可以捕获目标方法抛出的异常,并进行相应的处理操作。例如,可以在异常通知中发送告警或记录异常日志。

  4. 最终通知(After Advice):
    最终通知在目标方法执行结束后(包括正常结束和异常结束)执行,无论目标方法是否抛出异常,最终通知都会被执行。例如,可以在最终通知中释放资源或进行清理操作。

  5. 环绕通知(Around Advice):
    环绕通知是最为灵活的通知类型,它可以在目标方法执行前后都进行逻辑处理,并且可以控制是否执行目标方法。环绕通知需要负责显式地调用目标方法,并可以改变传递给目标方法的参数。

通过使用这些通知类型,我们可以将横切关注点(例如日志、事务管理等)与业务逻辑相分离,提高代码的可维护性和重用性。在Spring AOP中,通知是通过切面(Aspect)来组织和管理的。

Spring AOP中的通知举例:

@Aspect
@Component
public class MyAspect {//定义前置通知@Before("execution(* com.example.demo.service.UserService.addUser(..))")public void beforeAddUser(JoinPoint joinPoint) {System.out.println("before addUser");}//定义后置通知@AfterReturning(value = "execution(* com.example.demo.service.UserService.addUser(..))", returning = "result")public void afterAddUser(JoinPoint joinPoint, Object result) {System.out.println("after addUser, result: " + result);}//定义异常通知@AfterThrowing(value = "execution(* com.example.demo.service.UserService.addUser(..))", throwing = "ex")public void afterAddUserException(JoinPoint joinPoint, Exception ex) {System.out.println("after addUser exception, message: " + ex.getMessage());}//定义最终通知@After("execution(* com.example.demo.service.UserService.addUser(..))")public void afterAddUserFinally(JoinPoint joinPoint) {System.out.println("after addUser finally");}//定义环绕通知@Around("execution(* com.example.demo.service.UserService.addUser(..))")public Object aroundAddUser(ProceedingJoinPoint pjp) throws Throwable {System.out.println("around addUser start");Object result = null;try {result = pjp.proceed();System.out.println("around addUser end, result: " + result);} catch (Throwable e) {System.out.println("around addUser exception, message: " + e.getMessage());throw e;}return result;}
}

上面的代码中,我们定义了一个切面MyAspect,并在其中定义了前置通知、后置通知、异常通知、最终通知和环绕通知。这些通知分别会在UserService的addUser方法执行前后或出现异常时被触发执行。例如,在执行UserService的addUser方法前会执行beforeAddUser方法,执行成功后会执行afterAddUser方法,出现异常时会执行afterAddUserException方法,在执行结束时会执行afterAddUserFinally方法,在执行过程中会执行aroundAddUser方法。通过这些通知,我们可以对UserService的addUser方法进行统一的日志记录、事务管理等操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/196641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-宋红康-(课P14-P15)-基本查询语句(Select)

b站视频: 14-最基本的SELECT...FROM结构_哔哩哔哩_bilibili 8.4 基本查询(Select)语句 数据table: emp员工表创建如下 # 员工表 CREATE TABLE EMP (EMPNO INT PRIMARY KEY, -- 员工编号ENAME VARCHAR(10), -- 员工名称JOB VARCHAR(9), -- 工…

10、SQL注入——数据库基础

文章目录 一、数据库概述二、数据库分类Mysql数据库连接方法 三、识别数据库四、SQL语法4.1 SQL基本语法4.2 高级操作 一、数据库概述 数据库(database):存储在磁盘、磁带、光盘或其他外存介质上、按一定结构组织在一起的相关数据的集合。数…

webpack对项目进行优化

对项目进行优化是提高性能和效率的关键,以下是一些实用的Webpack优化技巧: 代码拆分(Code Splitting):将代码拆分为多个小块,按需加载。通过配置splitChunks插件,可以将公共代码提取到单独的文件…

常见代码优化案例记录

1. 使用StringBuilder优化字符串拼接&#xff1a; // 不优化的写法 String result ""; for (int i 0; i < 1000; i) {result i; }// 优化的写法 StringBuilder resultBuilder new StringBuilder(); for (int i 0; i < 1000; i) {resultBuilder.append(i)…

龙迅分配器LT86102UXE/LT86104UX,HDMI一分二/HDMI一分四

龙迅LT86102UXE描述; Lontium LT86102UXE HDMI2.0分配器具有1&#xff1a;2的分配器&#xff0c;符合HDMI2.0/1.4规范&#xff0c;最大6Gbps高速数据速率&#xff0c;自适应均衡RX输入和预先强调的TX输出&#xff0c;以支持长电缆应用程序&#xff0c;内部TX通道交换灵活的PCB…

部分c++11特性介绍

在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C98标准中的漏洞进行修复&#xff0c;语言的核心部分则没有改动&#xff0c;因此人们习惯性的把两个标准合并称为C98/03标…

Day50力扣打卡

打卡记录 三个无重叠子数组的最大和 链接 滑动窗口 class Solution:def maxSumOfThreeSubarrays(self, nums: List[int], k: int) -> List[int]:n, ans len(nums), []sum1 sum2 sum3 0maxsum1idx, maxsum12idx 0, ()maxsum1 maxsum12 total 0for i in range(2 * …

01 高等数学.武忠祥.0基础

第一章 函数与极限 01映射与函数 02 函数概念 对应法则 定义域 常见函数 函数的几种特性 周期函数不一定有最小周期。 涉及额外与复习 存在与任意的关系

在python中自己定义一个方法,但是没有写return XXX会有什么影响

【多么痛的领悟&#xff0c;找了两个小时的错误&#xff01;&#xff01;&#xff01;发现是少写个return】 print(data.task_ID) AttributeError: NoneType object has no attribute task_ID** 然后一句一句找&#xff0c;我找啊找&#xff01;&#xff01;&#xff01;&…

MYSQL练题笔记-高级查询和连接-简单题3题

写了下面的前3道题。 一、每位经理的下属员工数量 看到题目就知道和之前的至少有5名下属的经理很相似&#xff0c;嘿嘿写对了就不做过多的讲解了。 二、员工的直属部门相关表和题目如下 刚开始觉得很简单&#xff0c;但是仔细想想这道题有两个输出&#xff0c;觉得想不出来&a…

C语言数组(上)

# 数组的概念 数组是一组相同类型元素的集合。数组中存放的是一个或多个数据&#xff0c;但是数组中的元素个数不能为零&#xff1b;数组中存放的所有元素&#xff08;数据&#xff09;的类型必须是相同的。 数组分为一维数组和多维数组&#xff0c;多维数组一般比较多见的是二…

跨域问题与解决-gatway

3.6.1.什么是跨域问题 跨域&#xff1a;域名不一致就是跨域&#xff0c;主要包括&#xff1a; 域名不同&#xff1a; www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com域名相同&#xff0c;端口不同&#xff1a;localhost:8080和localhost8081 跨域问题&a…

ADB命令集锦,一起来学吧

前言 在测试APP时&#xff0c;我们常常会用到adb命令来协助测试&#xff0c;那么adb命令到底是什么&#xff1f;有什么用&#xff1f;怎么用&#xff1f; 今天我就整理了一些工作中常用的adb知识点&#xff0c;希望对大家有所帮助。 ADB学习全攻略 ADB是什么&#xff1f; a…

三种定时器的实现方式

一、Scheduled Schedule是Spring框架提供的一种简单的定时任务调度方法&#xff0c;通过注解的方式即可实现定时任务的调度。它适用于简单的定时任务需求&#xff0c;例如每隔一段时间执行一次任务或者在特定时间执行任务。Scheduled可以轻松地集成到Spring应用中&#xff0c;…

网工学习8-配置 STP 协议(一)

以太网交换网络中为了进行链路备份&#xff0c;提高网络可靠性&#xff0c;通常会使用冗余链路。但是使用冗余链路 会在交换网络上产生环路&#xff0c;引发广播风暴以及 MAC 地址表不稳定等故障现象&#xff0c;从而导致用户通信质量较 差&#xff0c;甚至通信中断。 为解决…

LangChain的函数,工具和代理(四):使用 OpenAI 函数进行标记(Tagging) 提取(Extraction)

在上一篇博客LangChain中轻松实现OpenAI函数调用 中我们学习了如何使用Pydantic来生成openai的函数描述对象&#xff0c;并且通过在langchain中调用Pydantic生成的函数描述变量来轻松实现openai的函数调用功能&#xff0c;在此基础上今天我们再介绍两个非常实用的功能&#xff…

2024年,Rust和Go学哪个更好?

Rust vs. Go&#xff0c;在2024年&#xff0c;应该选择哪一个&#xff1f;或者说应该选择哪种语言——GoLang还是Rust。这可能是许多程序员在选择语言时考虑的一个问题。选择理想的编程语言被视为在这个不断变化的环境中取得成功的重要抉择。 GoLang和Rust是当今使用的最年轻的…

【黑马甄选离线数仓day08_会员主题域开发】

1. 会员主题域需求说明 1.1 各类会员数量统计 说明&#xff1a;公司为了对不同会员进行不同的营销策略&#xff0c;对各类会员的数量都非常敏感&#xff0c;比如注册会员、消费会员、复购会员、活跃会员、沉睡会员。不仅需要看新增数量还要看累积数量。 指标&#xff1a;新增…

二十九、微服务案例完善(数据聚合、自动补全、数据同步)

目录 一、定义 二、分类 1、桶(Bucket)聚合: 2、度量(Metric&#xff09;聚合: 3、管道聚合&#xff08;Pipeline Aggregation&#xff09;&#xff1a; 4、注意&#xff1a; 参与聚合的字段类型必须是: 三、使用DSL实现聚合 聚合所必须的三要素&#xff1a; 聚合可配…

考研数学 每日一题

考研数学 每日一题