前言
基于黑马《SSM框架教程》的学习笔记,附链接:SSM框架教程
1 AOP 核心概念
AOP :(Aspect Oriented Programming)面向切面编程,是一种编程范式,负责指导开发者组织程序结构
同 OOP (Object Oriented Programming)面向对象编程一样,是一种思想;
Spring 理念:无入侵式编程
作用:在不惊动原始设计的基础上为其进行功能增强
【过程描述】
首先先找到程序中间的共性功能,抽出来写一个通知类,在通知类中定义一个方法,这个方法叫通知,抽出来以后并不是所有的方法都要去执行通知,找出执行对应通知的方法,定义为切入点,也就是说连接点式所有方法,切入点是匹配的某些方法,将通知和切入点进行绑定的东西叫做切面,切面描述的是在哪个切入点上执行哪些通知。AOP中的面向切面编程所指的就是这个切面。
2 AOP 作用
AOP的作用包括:
-
分离关注点:AOP可以将与业务逻辑无关的横切关注点(如日志记录、性能监控、事务管理等)从业务逻辑中分离出来,使得业务逻辑更加清晰和简洁。
-
提高代码复用性:AOP可以将横切关注点作为独立的模块,可以在不同的地方进行重复使用,从而提高代码的复用性。
-
提高代码的可维护性:通过AOP可以将横切关注点集中管理,当需要修改或添加新的横切关注点时,可以更加方便和快速地进行修改。
-
提高系统的灵活性:AOP可以使系统的各个模块之间的耦合度减小,从而使得系统更加灵活,能够更加容易地进行扩展和变更。
总之,AOP的作用在于通过分离和聚合横切关注点,提高代码的模块化和可维护性,从而使得软件开发更加高效和灵活。
3 AOP 入门案例
需求:在接口执行前输出当前系统时间
开发模式:XML 及 注解【以后开发使用注解,所以这里用注解】
思路分析:
1、导入坐标(pom.xml)
2、制作连接点方法(原始操作,Dao接口与实现类)
3、制作共性功能(通知类与通知)
4、定义切入点
5、绑定切入点与通知关系(切面)
6、定义通知类受 Spring 容器管理,并定义当前类为切面类
【注】Aspect:让里面的东西生效, 说明下面的内容是作为 AOP 的
7、 在 Spring 核心配置中开启 Spring 对 AOP 注解驱动支持
4 AOP 工作流程
1、Spring 容器启动
2、读取所有切面配置中的切入点
3、初始化bean,判断bean 对应的类中的方法是否匹配到任意切入点
匹配失败,创建对象
匹配成功,创建原始对象(目标对象)的代理对象
目标对象(Target):原始功能去掉共性功能对应的类产生的对象,这种对象时无法直接完成最终工作的。
代理:目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现,可以实现增强操作。
SpringAOP 的本质:代理模式
4、获取 bean 方法,调用方法并执行,完成操作
获取的 bean 是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作。
5 AOP 切入点表达式
切入点:要进行增强的方法
切入点表达式:要进行增强的方法的描述方式
所谓表达式,并不唯一,例如这里列举的两种表述方法的描述方式:
5.1 语法格式
动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数)异常名)
5.2 通配符
5.3 书写技巧
6 AOP 通知类型
AOP 通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置。
6.1 前置通知
6.2 后置通知
6.3 环绕通知【重点】
【注】如果没有使用 ProceedingJoinPoint 对原始方法进行调用,就会产生一种对原始操作进行隔离的效果,这个可以帮助我们做权限校验
6.4 返回后通知【了解】
6.5 抛出异常后通知【了解】
7 案例1:测量业务层接口万次执行效率
优化:
【注】通过 signature 可以拿到哪个接口对应哪个方法执行的
8 AOP 通知获取数据
8.1 获取原始操作的参数
8.2 获取原始操作的返回值
8.3 获取原始操作的异常【了解】
9 案例2 百度网盘密码数据兼容处理
10 Spring 事务
10.1 简介
事务作用:在数据层保障一系列的数据库操作同成功或同失败
Spring 事务作用:在数据层或业务层保障同一系列的数据库操作同成功同失败
【注】业务层实际组合了若干数据层的功能,在业务层开事务可以保障调用的多个数据层操作处理同一个事物,同成功同失败
10.2 案例 银行账户转账
需求:实现任意两个账号间转账操作
需求微缩:A账户减钱,B账户加钱
步骤:
【注】
①Spring 注解式事务通常添加在业务层接口中而不会添加到业务层实现类中,降低耦合
②注解式事务可以添加到业务方法上表示当前方法开启事务,也可以添加到接口上表示当前接口所有方法开启事务
【注】MyBatis 框架使用的是 JDBC 事务
11 Spring 事务角色
事务管理员:发起事务方,在 Spring 中通常指代业务层开启事务的方法
事务协调员:加入事务方,在 Spring 中通常指代数据层方法,也可以是业务层方法
12 Spring 事务相关配置
12.1 事务配置
【注】如果程序出现如下两种异常,就会做事务回滚,否则不回滚:① Error 系;② 运行时异常,所以在转账业务的案例中就需要设置事务回滚异常
12.2 案例:转账业务追加日志
分析:日志应该单独开启一个新事务,否则它和转账操作是同成功同失败,即一旦转账失败,日志将不会更新
处理过程:
12.3 事务传播行为
事务传播行为:事务协调员对事务管理员所携带事务的处理态度
通过设置事务传播行为,让事务的协调员可以具有不同的事务特征,具体设置类型有: