AOP计算方法执行时长

依赖引入

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

注意:在完成了引入AOP依赖包后,不需要去做其他配置。AOP的默认配置属性中,spring.aop.auto属性默认是开启的,也就是说只要引入了AOP依赖后,默认已经增加了@EnableAspectJAutoProxy,不需要在程序主类中增加@EnableAspectJAutoProxy来启用。

如果需要关闭,在 application.properties 中加入配置

spring.aop.auto=false

切面编写

package com.cc.analysis;

//AOP切面 :多个切面时,@Order(i)注解来标识切面的优先级。i的值越小,优先级越高
@Aspect
@Slf4j
@Component
public class ExeTimeAspect { @Pointcut("execution(public * com.cc.analysis.controller.AnalysisController.*(..))")
public void logTime(){} //统计请求的处理时间
ThreadLocal<Long> startTime = new ThreadLocal<>(); @Before("logTime()")
public void doBefore(JoinPoint joinPoint) throws Throwable{
startTime.set(System.currentTimeMillis());
//接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//记录请求的内容
log.info("Aspect_URL:"+request.getRequestURL().toString());
log.info("Aspect_Method:"+request.getMethod());
} @AfterReturning(returning = "ret" , pointcut = "logTime()")
public void doAfterReturning(Object ret){
//处理完请求后,返回内容
log.info("方法返回值:"+ JSON.toJSONString(ret));
log.info(String.format("方法执行时间: %d 毫秒", System.currentTimeMillis() - startTime.get()));
}
}

controller方法执行

@GetMapping("test")
public int test() {
return 1;
}

执行结果

2020-07-27 12:36:00.088  INFO 7457 --- [nio-9090-exec-2] c.c.analysis.ExeTimeAspect    : Aspect_URL:http://localhost:9090/test
2020-07-27 12:36:00.089 INFO 7457 --- [nio-9090-exec-2] c.c.analysis.ExeTimeAspect : Aspect_Method:GET
2020-07-27 12:36:00.093 INFO 7457 --- [nio-9090-exec-2] c.c.analysis.ExeTimeAspect : 方法返回值:1
2020-07-27 12:36:00.093 INFO 7457 --- [nio-9090-exec-2] c.c.analysis.ExeTimeAspect : 方法执行时间: 5 毫秒

疑问

springboot的启动类和AOP的配置类(ExeTimeAspect)需要在同一级目录下,才能够扫描到controller里的方法,执行AOP的效果。如果AOP的配置类(ExeTimeAspect)在子目录则无法执行。

尝试在启动类增加注解 @ComponentScan("com.cc.analysis.*") 也没能解决问题

成功执行目录

|____com
| |____cc
| | |____analysis
| | | |____App.java*
| | | |____ExeTimeAspect.java*
| | | |____controller
| | | | |____AnalysisController.java

失败目录

|____com
| |____cc
| | |____analysis
| | | |____App.java*
| | | |____config
| | | | |____ExeTimeAspect.java*
| | | |____controller
| | | | |____AnalysisController.java

AOP计算方法执行时长的更多相关文章

  1. 【java】计算一段代码执行时长java.lang.System类里的public static long currentTimeMillis()方法

    public class Test_currentTimeMillis { public static void main(String[] args) { long start=System.cur ...

  2. C#获取程序代码执行时长

    ArrayList list = new ArrayList(); long startTicks = DateTime.Now.Ticks; for (int i = 0; i < 10000 ...

  3. 【翻译自mos文章】当并行事务恢复进程在执行时,禁用并行事务恢复的方法

    当并行事务恢复进程在执行时,禁用并行事务恢复的方法 How to Disable Parallel Transaction Recovery When Parallel Txn Recovery is ...

  4. Amazon EC2免费VPS防止超额被扣钱三大方法:流量 硬盘读写 运行时长

    Amazon EC2也就是亚马逊云服务免费VPS主机服务,内存是613MB,月流量是30GB,主机空间是30GB,可以免费使用一年,又加上Amazon服务器全球多个节点CDN和本身的名气,早在2010 ...

  5. DbCommandInterceptor抓取EF执行时的SQL语句

    EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以允许我 ...

  6. html 事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码。

    看一个简单的例子: html: <head> <meta charset="UTF-8"> <title>Document</title& ...

  7. 用字符串连接SQL语句并用EXEC执行时,出现名称 '‘不是有效的标识符

    原文:用字符串连接SQL语句并用EXEC执行时,出现名称 ''不是有效的标识符 用字符串连接SQL语句并用EXEC执行时,出现名称 '这里是字符串连接的一条SQL语句‘不是有效的标识符 才发现,在写e ...

  8. iOS 执行时

    一.什么是执行时(Runtime)? 执行时是苹果提供的纯C语言的开发库(执行时是开发中经经常使用到的底层技术) 二.执行时的作用? 能获得某个类的全部成员变量 能获得某个类的全部属性 能获得某个类的 ...

  9. 承载(Host)通用语言执行时

    承载(Host)通用语言执行时(CLR) 还有一种使用COM 的方法是是把须要集成的 F# 代码与已有的 C/C++ 应用程序集成到一起.开成自己定义的承载通用语言执行时.通用语言执行时就是 C++ ...

随机推荐

  1. 2.pandas的数据结构

    对于文件来说,读取只是最初级的要求,那我们要对文件进行数据分析,首先就应该要知道,pandas会将我们熟悉的文件转换成了什么形式的数据结构,以便于后续的操作 数据结构 pandas对文件一共有两种数据 ...

  2. SpringBoot集成Dubbo+Zookeeper

    目录 Spring版本 dubbo_zookeeper负责定义接口 dubbo_provider 服务提供者 dubbo_consumer服务使用者 Spring版本 不知道为啥,新创建的Spring ...

  3. URI(统一资源标识符)

    URI:统一资源标识符 (Uniform Resource Identifier) 统一资源标识符是一个用于标识某一互联网资源名称的字符串. Web上可用的每种资源 -HTML文档.图像.视频片段.程 ...

  4. Oracle Dataguard故障转移(failover)操作

    注意:故障转移会破坏DG的主从关系,使其变为互不相关的2个数据库,谨慎使用. (一)故障转移操作流程图 (二)故障转移操作流程 备注:以下操作步骤与上面流程图步骤一一对应 STEP1:刷新所有未发送到 ...

  5. JavaScript高级程序设计(第三版) 2/25

    第一章 JavaScript简介 javascript 跟 java没有任何联系,可以这么说,基本上区别就相当于,老婆跟老婆饼.只是因为当初Netscape(js的公司)想搭上媒体热炒的Java的顺风 ...

  6. c++ 第二天 命名空间、数组

    C++ 命名空间 命名空间,也就是名称空间/名字空间,注意需要的头文件是 iostream ,而不是 iostream.h ,后者是旧版本的 C++ 头文件,并不支持命名空间. 为什么要使用命名空间? ...

  7. PHP mysqli_thread_id() 函数

    返回当前连接的线程 ID,然后杀死连接: <?php 高佣联盟 www.cgewang.com // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli ...

  8. PDOStatement::nextRowset

    PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)高佣联盟 www.cgew ...

  9. Fragment为什么须要无参构造方法

    日前在项目代码里遇到偷懒使用重写Fragment带参构造方法来传参的做法,顿生好奇,继承android.support.v4.app.Fragment而又不写无参构造方法不是会出现lint错误编译不通 ...

  10. Struts2中Get请求转码问题

    Tomcat默认编码为ISO859-1 Post提交时,struts2会对其转码为iso8859-1,因此不需要另外转码,而 Get提交表单,则需要单独转码,转码过程如下图: