AOP案例:测量业务层接口万次执行时间

1. 准备

需求:任意业务层接口执行均可显示执行的时长;

切入点配置: 所有业务层的方法都要绑定通知方法,所以用 接口.*
通知绑定类型:由于要原始方法的前后都要有增强,所以使用 @Around环绕

1.1 service层:

接口类:
在这里插入图片描述

实现类
实现类的方法都注入了dao层的bean;
在这里插入图片描述

1.2 dao层:

使用注解开发
在这里插入图片描述

1.3 SpringConfig配置类:

配置了jdbc.properties配置文件;
且已经整合了MyBatis:
在这里插入图片描述
jdbcConfig提供dataSource的bean
在这里插入图片描述
MyBatisConfig:
需要建立sqlSession和扫描mapper的两个bean;
Speing整合MyBatis的方法
在这里插入图片描述

2. AOP

定义:AOP即面向切面编程,是一种编程范式,知道开发者如何组织程序结构;

作用:在【不改变原始设计的基础上】 为其进行功能增强;
Spring理念:无侵入式编程;

思路分析
准备: ①导入AOP和Aspect的坐标 ②准备连接点(BookDaoImpl的原始方法)

  1. 制作共性功能------通知通知类
  2. 在通知类中定义 切入点 Pointcut
  3. 绑定通知方法和切入点(切面

2.1 导坐标

aop包默认依赖于spring-context;

在这里插入图片描述

2.2 在通知类中定义通知和切入点,并绑定

  • 在SpringConfig配置文件开启AOP驱动注释@EnableAspectJAuotoProxy ,让Spring去扫描@Aspect;在这里插入图片描述

  • 新建一个aop层和 ProjectAdvice通知类
    在通知类中注解@Component定义bean;
    注解@Aspect表明这是AOP

  • 注释 @PointCut 配置切入点空壳+切入点描述
    切入点描述:要监控所有的方法,则可能有返回值用 *, 监控的是所有service的任意方法,任意参数所以用 包名.*Serivce. *(…)
    在这里插入图片描述

  • 定义通知方法、绑定(5中绑定方式)
    通知方法为runSpeed,在方法内写增强功能的代码逻辑;
    使用了@Around环绕的方式绑定,需要ProceedingJoinPoint 作为通知方法的参数
    环绕控制返回值类型为Object,但是此处不需要可以为void;
    使用ProceedingJoinPoint对象的 proceed() 来调用原始方法;
    如果需要原始方法的查询结果,则要让接口方法的返回值为Object,由 pjp.preceed 获取返回值,并在最后return;
    执行一万次原始方法,然后打印时间差;
    在这里插入图片描述

2.3 测试类:

在这里插入图片描述

运行整个测试类的结果:
在这里插入图片描述

3. 问题及改进

问题:无法区分结果属于哪个方法;

改进
需要获取执行的是哪个方法,而ProceedingJoinPoint 描述了原来方法的执行对象;
ProceedingJoinPoint 对象 .getSignature() 可以获取 签名信息 signature
signature. getDeclaringTypeName() 获取原始方法的类型;
signature. getName 获取原始方法名;

在这里插入图片描述

再次打印:此时可区分方法属于的类和方法名;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值