[笔记]Spring-Day3 — AOP

AOP核心概念

  • (Aspect Oriented Programming)面向切面编程,在不改原有代码的前提下对其进行增强 — 代理模式

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

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

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

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

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

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

  • 通知类:定义通知的类

入门案例

环境准备

  1. 创建项目

  2. 添加spring依赖

  3. 添加Dao&DaoImpl类

  4. spring的配置类

  5. 编写app运行类

新增依赖

定义通知类和通知 —> 定义切入点 —> 制作切面 —> 将通知类配给容器并标识其为切面类

开启注解格式AOP功能

运行程序

AOP工作流程

(好像不重要)

Spring容器启动

  • 加载bean

    • 需要被增强的类,如:BookServiceImpl

    • 通知类,如:MyAdvice

读取所有切面配置中的切入点

初始化bean

获取bean执行方法

AOP配置管理

切入点表达式

  • * :单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现

  • ..:多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写

  • 书写技巧 1. 按标准规范开发 2. 查询操作的返回值建议使用匹配 3. 减少使用..的形式描述包 4. 对接口进行描述,使用表示模块名,例如UserService的匹配描述为Service 5. 方法名书写保留动词,例如get,使用表示名词,例如getById匹配描述为getBy* 6. 参数根据实际情况灵活调整

AOP通知类型

前置通知

后置通知

环绕通知(重点)

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

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

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

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

  • 返回后通知(了解) @AfterReturning("pt2()")

  • 抛出异常后通知(了解) @AfterThrowing

    image-20230608112904274

业务层接口执行效率

AOP通知获取数据

AOP事务管理

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

转账案例-需求分析

环境搭建

  1. 准备数据库

  1. 创建项目导入jar包

  1. 根据表创建模型类

  1. 创建Dao接口

  1. 创建Service接口和实现类

  1. 添加jdbc.properties文件

  1. 创建JdbcConfig配置类

  1. 创建MybatisConfig配置类

  1. 创建SpringConfig配置类

  1. 编写测试类

image-20230608113114611

最终项目结构如上

实现事务管理具体步骤

需要被事务管理的方法上添加注解@Transactional

在JdbcConfig类中配置事务管理器

在SpringConfig的配置类中开启事务注解 @EnableTransactionManagement

运行测试类

事务配置

  • @Transactional参数

Untitled

转账业务追加日志

创建日志表

添加LogDao接口

添加LogService接口与实现类

在转账的业务中添加记录日志

事务传播行为

  • 事务协调员对事务管理员所携带事务的处理态度

  • 转账失败后,所有的事务都回滚,导致日志没有记录下来 — 让log方法单独是一个事务

  • 修改logService改变事务的传播行为

最后更新于