SpringAOP来监控service层中每个方法的执行时间

2023-11-17

使用AOP来说,太方便了,并且特别适合这类场景。

代码如下,这里是将要统计的信息写到log文件中,也可以设计成写入表中。

package com.ecsoft.interceptor;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class TimeInterceptor {
    
    private static Logger log = LoggerFactory.getLogger(TimeInterceptor.class);
    
    // service层的统计耗时切面,类型必须为final String类型的,注解里要使用的变量只能是静态常量类型的  
    public static final String POINT = "execution (* com.ecsoft.service..*Impl.*(..))";
    /**  
     * 统计方法执行耗时Around环绕通知  
     * @param joinPoint  
     * @return  
     */  
    @Around(POINT)  
    public Object timeAround(ProceedingJoinPoint joinPoint) {  
        // 定义返回对象、得到方法需要的参数  
        Object obj = null;  
        Object[] args = joinPoint.getArgs();  
        long startTime = System.currentTimeMillis();  
  
        try {  
            obj = joinPoint.proceed(args);  
        } catch (Throwable e) {  
            log.error("统计某方法执行耗时环绕通知出错", e);  
        }  
  
        // 获取执行的方法名  
        long endTime = System.currentTimeMillis();  
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();  
        String methodName = signature.getDeclaringTypeName() + "." + signature.getName();  
  
        // 打印耗时的信息  
        this.printExecTime(methodName, startTime, endTime);  
  
        return obj;  
    }  
  
    /**  
     * 打印方法执行耗时的信息,如果超过了一定的时间,才打印  
     * @param methodName  
     * @param startTime  
     * @param endTime  
     */  
    private void printExecTime(String methodName, long startTime, long endTime) {  
        long diffTime = endTime - startTime;  
        //超过1秒的记录
        if (diffTime > 1000) {  
            log.info(methodName + ":" + diffTime + " :ms");  
        }  
    }  

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringAOP来监控service层中每个方法的执行时间 的相关文章

  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • 如何在java中将数组值排序为循环格式?

    我的数组值如下 String value 1 2 3 4 5 6 7 8 9 10 假设如果我将值 5 传递给 tat 数组 它应该按如下顺序排序 5 6 7 8 9 10 1 2 3 4 怎么办 有人帮忙吗 感谢你 你需要的就是所谓的轮换
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • 如何在 JPQL 或 HQL 中进行限制查询?

    在 Hibernate 3 中 有没有办法在 HQL 中执行相当于以下 MySQL 限制的操作 select from a table order by a table column desc limit 0 20 如果可能的话 我不想使用
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 将巨大的模式编译成Java

    有两个主要工具提供了将 XSD 模式编译为 Java 的方法 xmlbeans 和 JAXB 问题是 XSD 模式确实很大 30MB 的 XML 文件 大部分模式在我的项目中没有使用 所以我可以注释掉大部分代码 但这不是一个好的解决方案 目
  • Mockito 使用 @Mock 时将 Null 值注入到 Spring bean 中?

    由于我是 Spring Test MVC 的新手 我不明白这个问题 我从以下代码中获取了http markchensblog blogspot in search label Spring http markchensblog blogsp
  • 如何在单个查询中搜索 RealmObject 的 RealmList 字段

    假设我有一堂课 public class Company extends RealmObject private String companyId private RealmList
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微
  • 将非 Android 项目添加到 Android 项目

    我在 Eclipse 中有三个项目 Base Server 和 AndroidClient Base和Server是Java 1 7项目 而AndroidClient显然是一个android项目 基础项目具有在服务器和 Android 客户
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 如何使用 JMagick 转换色彩空间?

    如何使用 JMagick API 转换色彩空间 例如 CMYK gt RGB 和 RGB gt CMYK None
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • Log4j2 ThreadContext 映射不适用于parallelStream()

    我有以下示例代码 public class Test static System setProperty isThreadContextMapInheritable true private static final Logger LOGG
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp

随机推荐

  • 《三》微软Dynamics CRM 2016单服务器安装部署(Dynamics CRM 2016 安装)

    Microsoft Dynamic CRM 2016安装 在 AD域控和数据库服务器安装好的前提下 接下来我们来安装 Dynamic CRM Server 一 以具有管理员级别特权的用户身份登录到将安装Microsoft Dynamics
  • 如何使用Log4j?

    1 Log4j是什么 Log4j可以帮助调试 有时候debug是发挥不了作 用的 和分析 要下载和了解更详细的内容 还是访问其官方网站吧 http jakarta apache org log4j 2 Log4j的概念 Log4j中有三个主
  • Springboot Maven或Gradle 解决log4j2漏洞

    log4j2漏洞风靡全球 影响的版本范围 Apache Log4j 2 x lt 2 14 1 根据官方的解释需要将log4j2包的版本 升级到2 15 0 测试使用 Springboot 2 1 5 Gradle 6 3版本进行测试 当时
  • Spring 中的切点表达式介绍

    Spring 中的切点表达式介绍 翻译原文链接 Introduction to Pointcut Expressions in Spring 1 概述 在本教程中 我们将讨论 Spring AOP 切点表达式语言 In this tutor
  • Windows系统加固指引

    Windows系统加固指引 前言 1 禁用Guest账户禁用或删除其他无用账户 2 更改默认Administrator用户名 3 不显示最后登录的用户名 4 密码复杂度要求设置 5 windows帐户锁定策略 防止暴力破解 6 删除用户和组
  • leetcode专项刷题_数组(2)_两数之和/访问所有点的最小时间/统计有序矩阵中的负数/种花问题

    文章目录 两数之和 II 输入有序数组 题目解释 代码实现 访问所有点的最小时间 题目解释 代码实现 统计有序矩阵中的负数 题目解释 代码实现 种花问题 题目解释 代码实现 检查整数及其两倍数是否存在 题目解释 实现代码 两数之和 II 输
  • 云计算大会观感及对云计算的思考

    我思故我在 我眼中的第四届中国云计算大会 作者 朱金灿 来源 http blog csdn net clever101 承蒙CSDN的邀请 于2012年5月23日到5月25日参加了第四届中国云计算 在我看来这届大会的最大亮点是在于嘉宾的技术
  • kafka 安装使用及cpp kafka例子

    1 下载kafka 安装包 wget http mirrors tuna tsinghua edu cn apache kafka 2 3 0 kafka 2 12 2 3 0 tgz tar xvzf kafka 2 12 2 3 0 t
  • Codeforces Round 896 (Div. 2) A~D

    A Make It Zero 思路 长度为偶数 从1到n操作两次 长度为奇数 先从1到n操作一次 然后从1到n 1做两次 最后n 1到n做一次 AC代码 include
  • 弱监督目标检测之二 连续优化多实例学习

    上一次的博客提到了我们实验室发表在CVPR2018以及IEEE TPAMI上的工作MELM 1 这一次的博客进一步介绍基于MELM的最新的工作C MIL 也是实验室今年被CVPR2019接收的4篇论文之一 C MIL Continuatio
  • 读书笔记---《如何高效学习》

    学习是需要方法的 特别是在当今信息爆炸的时代 如何高效的处理信息 有机的整合知识 已经成为学习的关键 如果只用一种方式了解某样事物 你就不会真正了解她 了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系 通过联系 你可将想法内化于
  • 用python做爬虫,怎么入门学什么?

    用python做爬虫 怎么入门学什么 前些日子 写了一篇Python能做什么 当然高端的算法ai领域应用非常广泛 但是对于想学习Python实现找工作或者自己网上接单兼职的小伙伴来说 还是做好爬虫更适合 那么爬虫究竟是什么呢 爬虫可以理解为
  • 【图像识别】图像特征、特征检测、特征提取

    目录 1 图像特征 2 特征检测与特征提取 2 1 特征检测算法 2 2 1Moravec 2 1 2 Harris 2 1 3 FAST 2 1 4 SIFT 2 1 5 SURF 2 1 6 BRIRF 2 1 7 ORB 2 2 特征
  • [Qt] [QDir] 创建文件夹和删除文件夹

    1 创建文件夹 mkdir和mkpath都可以创建文件夹 QDir temp bool result 创建名为test的文件夹 mkdir 若csdn文件夹不存在 则test文件夹创建失败 result temp mkdir d csdn
  • 回溯--深度优先搜索(图的M着色问题 poj1129)

    回溯 图的m着色问题 题目描述 给定无向连通图G V E 和m种不同的颜色 用这些颜色为图G的各顶点着色 每个顶点着一种颜色 是否有一种着色法使G中相邻的两个顶点有不同的颜色 这个问题是图的m可着色判定问题 若一个图最少需要m种颜色才能使图
  • 使用QGraphicsItem绘制微信消息文本框

    微信消息框如下 使用QGraphicsItem绘制 怎么绘制呢 先不考虑头像 那文本框就是由一个菱形矩形加一个小箭头组成的 所以很简单就能画出来了 void PopoItem paint QPainter painter const QSt
  • 彻底解决Python(win)导包from import错误问题

    1 一句话 一句话 关键是os sys path这个目录 这个目录有 就from import没问题 没有 就报错 解决办法就是千方百计加进去即可 例如 import os print os sys path import dd from
  • 单链表中求倒数第几个节点

    问题描述 在单链表中求出倒数第K个节点 要求快速 方法一 利用链表的长度 不推荐 此方法必须事先知道链表的长度 在有长度的信息链表中 此方法可行 比如我之前的链表是这样的实现 参考博文 http blog csdn net dawn aft
  • 机器学习之梯度提升决策树(GBDT)

    1 GBDT算法简介 GBDT Gradient Boosting Decision Tree 是一种迭代的决策树算法 由多棵决策树组成 所有树的结论累加起来作为最终答案 我们根据其名字 Gradient Boosting Decision
  • SpringAOP来监控service层中每个方法的执行时间

    使用AOP来说 太方便了 并且特别适合这类场景 代码如下 这里是将要统计的信息写到log文件中 也可以设计成写入表中 package com ecsoft interceptor import org aspectj lang Procee