SSM(B站黑马)学习笔记
01-1-Spring概述
01-2-Spring IOC
01-3-Spring AOP
01-4-Spring 事务
02-SpringMVC
03-SSM整合
04-Maven高级
05-SpringBoot
06-MyBatisPlus
文章目录
前言
SSM(B站黑马)学习笔记 01-3-Spring AOP
AOP
AOP简介
- AOP(Aspect Oriented Programming)面向切面编程,是一种编程思想、一种编程范式,指导开发者如何组织程序结构
- 作用:在不惊动原始设计等等基础上为其进行功能增强
- Spring理念:无入侵式/无侵入式
如下图BookDaoImpl的实现类中save方法通过循环计算程序执行时间并进行循环打印,其它方法只有打印
当执行save方法时程序毫无疑问进行了循环打印并计算执行时间。但执行update和delete方法也循环打印并计算执行时间了,执行select方法又正常了。原因是使用了AOP对update和delete方法进行功能增强 select没有。这就是不惊动原始设计等等基础上为其进行功能增强
AOP核心概念
连接点是所有的方法,而切入点是被选中要加强的方法。通知是要在切入点执行的操作
连接点范围大,切入点范围小,切入点一定在连接点中。所有的方法都是连接点,我要增强的方法是切入点,就是说我要在这个方法切入
AOP快速入门
入门案例思路分析
初始化环境
1.导入坐标依赖(pom.xml)
spring-aop包随着context默认一起导入的,aspects在前面Spring Framework系统架构有说
2.制作连接点方法(初始化环境已完成)
3.制作共性功能(通知类与通知)
4.定义切入点(@Pointcut)
5.绑定切入点与通知关系(切面)(@Before @After等)
@Component定义为bean交给Spring
@Aspect声明该类为AOP
@EnableAspectJAutoProxy告诉Spring有用注解开发的AOP 开启扫描注解AOP
执行AOP update通过AOP输出当前时间 save本来就有
AOP工作流程
切入点匹配成功 类型是BookDaoImpl 但对象是用代理对象 匹配失败则创建对象
匹配成功
匹配失败
![](https://i-blog.csdnimg.cn/blog_migrate/209b0ee6859496419ef2ea16c52f7557.png)
补充:代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
AOP切入点表达式
![](https://i-blog.csdnimg.cn/blog_migrate/2c22bedd67e96dd15c32adf4e7665f95.png)
语法格式
通配符
书写技巧
AOP通知类型
@Before:前置通知,在原始方法运行之前执行
@After:后置通知,在原始方法运行之后执行
@Around:环绕通知,在原始方法运行的前后执(重要)
在通知方法初传入ProceedingJoinPoint 对象 使用.proceed()方法表示对原始操作的调用
注意:环绕通知分无返回值和有返回值
无返回值
有返回值
定义有返回值select的切入点
当执行有返回值切入点的环绕通知,连接点无法正常返回值
异常的原因是它不匹配原始操作的返回值类型,如果原始操作无返回值还好,但当原始操作的返回是int或其它,要保证原来的操作有返回值,所以把返回值再抛出去
环绕通知的标准写法不管切入点有无返回值都要返回Object 切入点无返回值返回的是null
@AfterReturning:返回后通知,在原始方法执行完毕后运行,且原始方法执行过程中未出现异常现象 (了解)
@AfterThrowing:抛出异常后通知,在原始方法执行过程中出现异常后运行 (了解)
例如当程序出现 1/0
案例:测试业务层接口万次执行效率
案例初始化
pom.xml->配置SpringConfig注解开发->整合Mybatis、JUnit
1.导入依赖 开启扫描注解AOP
2.定义通知类制作通知
Signature对象保存了一次执行的签名信息,相当于封装了当前的执行过程,可以获得切入点的类型和方法名称等
3.运行测试类计算执行时间
AOP通知获取数据
有时候切入点要对数据的不同进行不同的处理,但通知执行都是统一操作,这时就要在通知里获取原始操作的数据进行不同处理的aop
![](https://i-blog.csdnimg.cn/blog_migrate/6c092fcea00d31d547a3f52598ba177d.png)
demo初始内容
获取参数
JoinPoint:用于描述切入点的对象,必须配置成通知方法中的第一个参数,可用于获取原始方法调用的参数
ProceedingJoinPoint:专用于环绕通知,是JoinPoint子类,可以实现对原始方法的调用
pjp.proceed(args)可以把获取到的参数修改再还给原始操作,修改原始操作的传参
此方法多用于处理错误格式的数据保证程序正常运行,例如输入账户或密码时多了一个空格
获取返回值
//设置返回后通知获取原始方法的返回值,要求returning属性值必须与方法形参名相同 @AfterReturning(value = “pt()”,returning = “ret”)
如果原始操作有返回值,就把返回值装到形参ret里,如果要搭配JoinPoint,JoinPoint一定要放在形参第一个
获取异常(了解)
设置抛出异常后通知获取原始方法运行时抛出的异常对象,要求throwing属性值必须与方法形参名相同
手动抛出异常
案例:百度网盘密码数据兼容处理
模拟对提取码多余空格去除
案例初始化
业务处理
成功去除
AOP总结
aop适用于相同的大量使用功能,需要在很多地方加的,AOP是不二选择,简化共性功能的开发
注:
该内容是根据B站黑马程序员学习时所记,相关资料可在B站查询:黑马程序员2022最新SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术