测量业务层接口万次执行时间
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的原始方法)
- 制作共性功能------通知和通知类;
- 在通知类中定义 切入点 Pointcut
- 绑定通知方法和切入点(切面)
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
获取原始方法名;
再次打印:此时可区分方法属于的类和方法名;