测量业务层接口万次执行时间
- 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获取原始方法名;

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




















