测量业务层接口万次执行时间
- 1. 准备
- 1.1 service层:
- 1.2 dao层:
- 1.3 SpringConfig配置类:
- 2. AOP
- 2.1 通知类
- 2.2 测试类:
- 3. 问题及改进
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
2.1 通知类
-
在SpringConfig开启AOP注释
@EnableAspectJAuotoProxy
,让Spring去扫描@Aspect; -
新建一个aop层和ProjectAdive通知类:
在通知类中注解@Component
定义bean;注解@Aspect
表明这是AOP; -
注释
@PointCut
配置切入点:空壳+切入点描述
切入点描述:要监控所有的方法,则可能有返回值用 *, 监控的是所有service的任意方法,任意参数所以用 包名.*Serivce. *(…)
-
通知方法并绑定:
使用了@Around
环绕的方式绑定,需要ProceedingJoinPoint
作为通知方法的参数;
环绕控制返回值类型为Object,但是此处不需要可以为void;
使用ProceedingJoinPoint对象的proceed()
来调用原始方法;
如果需要原始方法的查询结果,则要让接口方法的返回值为Object,由pjp.preceed获取返回值,并在最后return;
执行一万次原始方法,然后打印时间差;
2.2 测试类:
运行整个测试类的结果:
3. 问题及改进
问题:无法区分结果属于哪个方法;
改进:
需要获取执行的是哪个方法,而ProceedingJoinPoint
描述了原来方法的执行对象;
ProceedingJoinPoint 对象.getSignature()
可以获取 签名信息 signature;
signature.getDeclaringTypeName()
获取原始方法的类型;
signature.getName
获取原始方法名;
再次打印:此时可区分方法属于的类和方法名;