添加依赖

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

编写 ServiceLogAspect.java

新建 ServiceLogAspect.java 文件,然后输入以下内容:

package cn.myesn.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; @Aspect
@Component
public class ServiceLogAspect {
private static final Logger log = LoggerFactory.getLogger(ServiceLogAspect.class); /**
* AOP 通知:
* 1. 前置通知:在方法调用之前执行
* 2. 后置通知:在方法正常调用之后执行(不能抛出异常)
* 3. 环绕通知:在方法调用之前和之后,都分别可以执行的通知
* 4. 异常通知:如果在方法调用过程中发生异常,则通知
* 5. 最终通知:在方法调用之后执行(相当于 try-catch-finally 中的 finally)
*/ /**
* @Around 环绕通知
*
* 记录 service 方法执行时间,根据不同时间输出不同的日志级别
*
* 切面表达式:
* execution 代表所要执行的表达式主题
* 第一处 * 代表方法返回类型,* 代表所有类型
* 第二处包名 cn.myesn.service.impl 代表 aop 监控的类所在的包
* 第三处 .. 代表该包及其子包下的所有类方法
* 第四处 * 代表类名,* 代表所有类
* 第五处 *(..),* 代表类中的方法名,* 表示所有方法,(..) 表示方法中的任何参数
*
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("execution(* cn.myesn.service.impl..*.*(..))")
public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("----- 开始执行 {}.{}-----",
joinPoint.getTarget().getClass(),
joinPoint.getSignature().getName()); // 记录开始时间
final long begin = System.currentTimeMillis(); // 执行目标 service
final Object result = joinPoint.proceed(); // 记录结束时间
final long end = System.currentTimeMillis();
final long takeTime = end - begin;
if (takeTime > 3000) {
log.error("----- 执行结束,耗时:{} 毫秒 -----", takeTime);
} else if (takeTime > 2000) {
log.warn("----- 执行结束,耗时:{} 毫秒 -----", takeTime);
} else {
log.info("----- 执行结束,耗时:{} 毫秒 -----", takeTime);
} return result;
}
}

spring aop 记录 service 方法调用时长 - 环绕通知的更多相关文章

  1. 基于 Annotation 拦截的 Spring AOP 权限验证方法

    基于 Annotation 拦截的 Spring AOP 权限验证方法 转自:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilte ...

  2. Spring AOP在函数接口调用性能分析及其日志处理方面的应用

    面向切面编程可以实现在不修改原来代码的情况下,增加我们所需的业务处理逻辑,比如:添加日志.本文AOP实例是基于Aspect Around注解实现的,我们需要在调用API函数的时候,统计函数调用的具体信 ...

  3. C#中引用类型的变量做为参数在方法调用时加不加 ref 关键字的不同之处

    ​ 一直以为对于引用类型做为参数在方法调用时加不加 ref 关键字是没有区别的.但是今天一调试踪了一下变量内存情况才发现大有不同. 直接上代码,结论是:以下代码是使用了 ref 关键字的版本.它输出1 ...

  4. Spring AOP中定义切点(PointCut)和通知(Advice)

    如果你还不熟悉AOP,请先看AOP基本原理,本文的例子也沿用了AOP基本原理中的例子.切点表达式 切点的功能是指出切面的通知应该从哪里织入应用的执行流.切面只能织入公共方法.在Spring AOP中, ...

  5. Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)

    Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效) 前言 今天在使用Spring cache的Cacheable注解的过程中遇见了一个Cacheable注解失效的问题, ...

  6. spring aop 动态代理批量调用方法实例

    今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候 ...

  7. 使用spring框架进行aop编程实现方法调用前日志输出

    aop编程 之使用spring框架实现方法调用前日志输出 使用spring框架实现AOP编程首先需要搭建spring框架环境: 使用Spring框架实现AOP工程编程之后,不需要我们去写代理工厂了,工 ...

  8. spring aop对service层日志和异常的处理

    1.aop是什么 AOP是Aspect Oriented Programming的缩写,意思是面向切面编程,与OOP(Object Oriented Programming)面向对象编程对等,都是一种 ...

  9. spring aop记录用户的操作

    1.命名空间 xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.or ...

随机推荐

  1. 学习MFS(三)

    1.MooseFS是什么 一个类MooseFS是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本,然而对于访问MFS的客户端或者 ...

  2. IPhoneX网页布局简介

    IPhoneX全面屏是十分科技化的,但是由于其圆角和摄像头刘海位置以及操控黑条的存在使得我们需要去对其样式做一些适配,没有X的同学可以开启 Xcode 9 的iPhone X 模拟器作为学习和调试. ...

  3. 走一步再走一步,揭开co的神秘面纱

    前言 原文地址 源码地址 了解co的前提是已经知晓generator是什么,可以看软大神的Generator 函数的语法,co是TJ大神写的能够使generator自动执行的函数库,而我们熟知的koa ...

  4. Vue3生命周期的理解

    beforeCreate():在实例生成之前 created():在实例生成之后 beforeMount():在模板已经被编译成函数之后,组件内容被渲染到页面之前 mounted():在组件内容被渲染 ...

  5. 【Android开发】Coding + git命令行基本使用

    上传代码 进入本地仓库的目录. cd ... 查看仓库链接 : git remote -v 如果没有,则添加url链接 : git remote add testName https://git.co ...

  6. C++的"开始" Hello World! 你好世界!

    # C++的"开始" Hello World! 你好世界! ```C++ // 第一个程序 //代表注释这一行 #include <iostream> //c++专属头 ...

  7. 解决hexo报错spwan failed

    报错1 FATAL { err: Error: Spawn failed at ChildProcess.<anonymous> (/usr/local/src/hexo/cairbin/ ...

  8. Lumia1520 手机刷 Windows10 arm双系统

    注意问题 升级到Windows 10 Mobile 的需重新刷回WP8.1,否则解锁会失败 部分手机刷机win10arm后出现屏幕卡死现象,目前除了换屏或重新焊接暂无其他解决方案,请谨慎刷机(当然如果 ...

  9. 安卓记账本开发学习day7之完成进度

    支持长按删除记录,与根据备注搜索相关的收入或支出情况

  10. border 流光高光

    <template> <div>   <div class="conic"></div> <div class="c ...