Spring Day03

AOP面向切面编程,一种编程范式,指导开发者如何组织程序结构

OOP面向对象编程

作用:在不惊动原始设计的基础上为其进行功能增强

Spring理念: 无入侵式/无侵入式

AOP核心概念:

连接点(JoinPoint): 程序执行过程中的任意位置,粒度为执行方法,抛出异常,设置变量等

在SpringAOP中,理解为方法的执行

切入点(Pointcut): 匹配连接点的方式

在SpringAOP 中,一个切入点可以只描述一个具体方法,也可以匹配多个方法

匹配多个方法,所有的save方法,所有get开头的方法,所有Dao的结尾的接口中的任意方法,所以带有一个参数的方法

通知(Advice) :在切入点执行的操作,也就是共性功能

在SpringAOP中,功能最终以方法的形式呈现

通知类:定义通知的类

切面(Aspect):描述通知与切入点的对应关系

导入坐标

首先在配置类上写上 @EnableAspectJAutoProxy

切入点定义依托一个不具有实际意义的方法进行,即无参数,无返回值,方法体无实际逻辑

切入点与通知是通过引用来确认的

定义通知类受Spring容器管理,并定义当前类为切面类

争个AOP的实现过程是通过代理模式实现的

描述方法一:执行com.itheima.dao包下的BookDao接口中的无参数update方法

excution(void com.itheima.dao.BookDao.update())

描述方法二: 执行com.itheima.dao.impl包下的BookDaoImpl类中的无参数update方法

execution(void com.itheima.dao.impl.BookDaoImpl.update())

AOP切入点表达式

切入点表达式标准格式: 动作关键字( 访问修饰符 返回值 包名.类/接口名.方法名(参数)异常名)

动作关键词: 描述切入点的行为动作,例如execution表示执行到指定切入点

访问修饰符: public , private 等,可以省略

返回值:

包名:

类/接口名:

方法名:

参数:

异常名:

AOP通知类型

AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置

AOP通知共分为5种类型

前置通知

后置通知

环绕通知(重点)

环绕通知是否扔出异常,为啥需要抛出异常,因为在Around中我需要对原始操作的调用,但是原始操作我并不知道是否有异常,所以要抛出

然后因为是环绕,我们需要对原来的操作进行调用,传入形参ProceedingJoinPoint pjp,用这个来调用,我需要告诉他们在原始操作之前进行调用,还是之后进行调用

上面是无返回值的,那么如果有返回值呢,那么我们就需要在Around上进行操作

返回后通知

抛出异常后通知(了解)

@Around注意事项

1.环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知

  1. 通知中如果未使用ProceedingJoinPoint对原始方法进行调用将跳过原始方法的执行

3.对原始方法的调用可以不接收返回值,通知方法设置成void即可,如果接收返回值,必须设定为Object类型

4.原始方法的返回值如果是void类型,通知方法的返回值类型可以设置成void,也可以设置成Object

5.由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须抛出Throwable

AOP通知获取数据

获取切入点方法的参数

JoinPoint: 适用于前置后置返回后 抛出异常后通知

ProceedingJointPoint: 适用于环绕通知

获取切点点方法返回值

返回后通知

环绕通知

获取切入点方法运行异常信息

抛出异常后通知

环绕通知

怎么用形参去接收返回值,如图

并且如果有JoinPoint的话必须把它放到第一位

AOP总结:

概念 : 面向切面编程,一种编程范式

作用: 在不惊动原始设计的基础上位方法进行功能增强

核心概念

代理(Proxy): SpringAOP的核心本质是采用代理模式实现的

连接点(JoinPoint): 在SpringAOP中,理解为任意方法的执行

切入点(PointCut) : 匹配连接点的式子,也是具有共性功能的方法描述

通知(Advice) : 若干个方法的共性功能,在切入点处执行,最终体现一个方法

切面(Aspect) : 描述通知与切入点的对应关系

目标对象(Target): 被代理的原始对象称为 目标对象

通知类型

前置类型

后置类型

环绕通知(重点):

环绕通知依赖形参ProceedingJoinPoint 才能实现对原始方法的调用

环绕通知可以隔离原始方法的调用执行

环绕通知返回值设置为Object类型

环绕通知后可以对原始方法调用过程中出现的异常进行处理

返回后通知

抛出异常后通知

Spring事务简介

事务作用: 在数据层保障一系列的数据库操作同成功同失败

Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败

Spring注解式事务通常添加在业务层接口中而不会添加业务层实现类中,降低耦合

注解式事务可以添加到业务方法上表式当前方法开始事务,也可以添加到接口上表示当前接口所有方法开启事务

Transaction怎么实现回滚呢,Transanction就是让其中的所有事务,都变成同一个事务,这样就能实现回滚了

事务传播行为: 事务协调员对事务管理员所携带事务的处理态度

相关推荐
寻星探路7 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
想用offer打牌8 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
曹牧9 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX9 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了9 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法10 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty72510 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎10 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄10 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
Moment10 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端