Spring 重点知识总结(三)——AOP

前言

        基于黑马《SSM框架教程》的学习笔记,附链接:SSM框架教程

1 AOP 核心概念

AOP :(Aspect Oriented Programming)面向切面编程,是一种编程范式,负责指导开发者组织程序结构

同 OOP (Object Oriented Programming)面向对象编程一样,是一种思想

Spring 理念:无入侵式编程

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

【过程描述】

       首先先找到程序中间的共性功能,抽出来写一个通知类,在通知类中定义一个方法,这个方法叫通知,抽出来以后并不是所有的方法都要去执行通知,找出执行对应通知的方法,定义为切入点,也就是说连接点式所有方法,切入点是匹配的某些方法,将通知和切入点进行绑定的东西叫做切面,切面描述的是在哪个切入点上执行哪些通知。AOP中的面向切面编程所指的就是这个切面。

2 AOP 作用

AOP的作用包括:

  1. 分离关注点:AOP可以将与业务逻辑无关的横切关注点(如日志记录、性能监控、事务管理等)从业务逻辑中分离出来,使得业务逻辑更加清晰和简洁。

  2. 提高代码复用性:AOP可以将横切关注点作为独立的模块,可以在不同的地方进行重复使用,从而提高代码的复用性。

  3. 提高代码的可维护性:通过AOP可以将横切关注点集中管理,当需要修改或添加新的横切关注点时,可以更加方便和快速地进行修改。

  4. 提高系统的灵活性: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 事务传播行为

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

通过设置事务传播行为,让事务的协调员可以具有不同的事务特征,具体设置类型有:

  • 19
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值