spring aop,作用:可以对service层代码进行监听,统计每个方法用时
aop是什么:面向切面编程(aop开发出来的代码)
用在哪里:(压测/提效)
1.controller层方法用时不用统计,核心都在服务层代码(得到参数立马调服务层)
2.服务层方法用时统计,若时间长说明代码的业务逻辑复杂,计算量大或代码有瓶颈。总之时间长就说明此方法有问题
符合要求的时间就跳过,超过指定阀值(200毫秒)时间再打印出结果
步骤:
切面类先随项目启动--服务层类进行监听---调用前开始计时-- controller调用service,并返回结果--调用后结束技术
- 切面类随项目启动 --在类上定义注解类@Aspect+@Configuration ;(@Aspect说明此类是切面类,@Configuration是让切面类随项目启动)
- 再对服务层类下的所有方法监听--定义@Pointcut对应的方法,对服务层下的所有类和方法进行监听
- 调用前开始计时---用@Around绑定切点,进行调用前的开始计时
- controller调用service,并返回结果---controller调用service并返回结果,引入ProceedingJoinPoint类,用joinPoint调用这个方法proceed();返回结果
- 调用后结束技术---调用后结束计时,统计时间差
- 打印xx方法,用时xx毫秒--
- 引入@Data和@ConfigurationProperties注解+并定义alarmTime
注解相关:
@Aspect 切面类注解
@Pointcut 切点注解,作用是对服务层下的所有类和方法进行监听; 变量:value定义切点规则,规则是execution(修饰符匹配? 返回值匹配 类路径匹配? 方法名匹配(参数匹配) 异常类型匹配?);
@Around 环绕注解,作用是对服务层方法调用前计时,方法运行后统计结束时间,最后可算出时间差
@Before 作用是对服务层方法调用前的操作
监听value值里填写规则,规则类型是返回值匹配
调用前计时
controller调用service,并返回结果
增加结束时间endtime
结束时间-开始时间=用时统计,打印用时
打印类,方法,参数,用时,先进行获取监听的类classname等
优化可以这样写
测试
因为返回类型是void,所以报错了500代码写错也会报错
更改返回类型为object,不知道什么类型的时候写父类,后续加return
测试
符合要求的时间就跳过,超过指定阀值(200毫秒)时间再打印出结果
初始化一个阀值
设置变量
增加注解增加配置文件,data是代替set/get方法
用时统计