SpringBoot中使用AOP实现计算Service执行时间
1、增加POM.XML的依赖架包
<!-- 引入 spring aop 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency> 2、编写AOP切面主体类
如:LogServiceTakeTime
package com.leecx.aop; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; /**
* <p>Title:</p>
* <p>Description:service的方法执行需要多少时间统计</p>
* <p>Copyright:Copyright (c) 2018</p>
* <p>Company:东软集团股份有限公司</p>
* CreateDate:2018/4/18 0018 下午 23:09
* Author:段美林[duanml@neusoft.com]
* Version:1.0
*/
//申明主体类,定义切面主体类
@Aspect
@Component
public class LogServiceTakeTime { private final static Logger log = LoggerFactory.getLogger(LogServiceTakeTime.class); @Pointcut("execution(* com.leecx.service..*.*(..))")
public void performance(){
} @Around("performance()")
public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { //记录起始时间
long begin = System.currentTimeMillis();
Object result = "";
/** 执行目标方法 */
try{
result= joinPoint.proceed();
}
catch(Exception e){
log.error("日志记录发生错误, errorMessage: {}", e.getMessage());
}
finally{
/** 记录操作时间 */
long took = System.currentTimeMillis() - begin;
if (took >= 10000) {
log.error("Service 执行时间为: {}秒", took);
// log.error("Controller 执行时间为: {}毫秒", took);
} else if (took >= 5000) {
log.warn("Service 执行时间为: {}秒", took);
// log.warn("Controlle r执行时间为: {}毫秒", took);
} else if (took >= 3000) {
log.info("Service执行时间为: {}秒", took);
// log.info("Controller 执行时间为: {}毫秒", took);
}
// TODO 日志保存到MongoDB中
}
return result;
} @Before("performance()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
log.info("doBefore");
} @AfterReturning(returning = "ret", pointcut = "performance()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容
log.info("doAfterReturning");
} }
说明:
1、在类的主体上加上注解定义切面并申明 @Aspect 定义切面
2、@Pointcut("execution(* com.leecx.service..*.*(..))") 定义切入点,一般使用表达式申明切入的范围
如com.leecx.service 包下的所有方法都会被拦截切面到
3、@Before:切入点开始执行前处理的方法
4、@After:切入点结尾执行的方法
5、@AfterReturning:在切入点return数据后执行的方法(一般用于对返回数据的包装)
6、@Around:在切入点前后执行的方法
7、@AfterThrowing:抛出异常执行的方法
题外话:
在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut”切入点”
例如定义切入点表达式 execution (* com.sample.service.impl..*. *(..))
execution()是最常用的切点函数,其语法如下所示:
整个表达式可以分为五个部分:
1、execution(): 表达式主体。
2、第一个*号:表示返回类型, *号表示所有的类型。
3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。
4、第二个*号:表示类名,*号表示所有的类。
5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数
SpringBoot中使用AOP实现计算Service执行时间的更多相关文章
- Springboot中使用AOP统一处理Web请求日志
title: Springboot中使用AOP统一处理Web请求日志 date: 2017-04-26 16:30:48 tags: ['Spring Boot','AOP'] categories: ...
- SpringBoot图文教程5—SpringBoot 中使用Aop
有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...
- 在SpringBoot中配置aop
前言 aop作为spring的一个强大的功能经常被使用,aop的应用场景有很多,但是实际的应用还是需要根据实际的业务来进行实现.这里就以打印日志作为例子,在SpringBoot中配置aop 已经加入我 ...
- 编写SpringBoot 中的AOP
编写SpringBoot 中的AOP 在程序开发的过程中会使用到AOP的思想,面向切面进行开发,比如登录的验证,记录日志等等-频繁需要操作的步骤,在遇到这种情况时就要使用Spring 的AOP了 Sp ...
- springboot 中使用AOP
网上关于AOP的例子好多,各种名词解释也一大堆,反正名词各种晦涩,自己写个最最最简单的例子入门mark一下,以后再深入学习. maven依赖 <dependency> <groupI ...
- SpringBoot中使用AOP打印接口日志的方法(转载)
前言 AOP 是 Aspect Oriented Program (面向切面)的编程的缩写.他是和面向对象编程相对的一个概念.在面向对象的编程中,我们倾向于采用封装.继承.多态等概念,将一个个的功能在 ...
- spring-boot中的AOP
public class User { private Integer id; private String username; private String note; public User(In ...
- springboot中使用aop技术
aop是面向切面编程的意思,它可以需要先选择一些切入点,然后对这些切入点进行拦截,注入统一的代码逻辑,这也是解耦的一种方式,也是为了避免重复的代码,让开发人员把关注点放在业务上. 引用包 'org.s ...
- SpringBoot图文教程6—SpringBoot中过滤器的使用
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文系列教程技术大纲 鹿老师的Java笔记 SpringBo ...
随机推荐
- 安装 LAMP
卸载 并安装 MYSQL rpm -qa | grep mysql rpm -e mysql-libs--.el6.x86_64 -.el6.x86_64 cd /usr/local/src/ wge ...
- matlab读写图片,读取图像序列,读取AVI视频
介绍使用matlab读写图片,读取图像序列,读取AVI视频的方法: 一.读写图像 使用matlab读一幅图像,并另存 % Filename: ImageReadWrite clc; clear; i ...
- 引用 LPSTR、LPCSTR、LPTSTR、LPCTSTR、LPWSTR及LPCWSTR的意义及区别
1.ANSI(即MBCS):为多字节字符集,它是不定长表示世界文字的编码方式.ANSI表示英文字母时就和ASCII一样,但表示其他文字时就需要用多字节. 2.Unicode:用两个字节表示一个字符 ...
- laravel的model例子
5里面直接artisan建立model ./artisan make:model MyModel 找到MyModel,改成下面这样 <?php namespace App; use Illumi ...
- bean对grub4dos做出的巨大贡献总结
bean对grub4dos做出的巨大贡献总结 ===================================================================bean对grub4 ...
- HTML5的LocalStorage和sessionStorage的使用
本文转载自:http://www.cnblogs.com/qiutianlidehanxing-blog/p/5953746.html html5中的Web Storage包括了两种存储方式:sess ...
- 【转】使用JMeter做性能测试的心得
企业应用开发过程中,性能测试是很重要的一个环节,在这个环节中Apache的JMeter以它开源.100%纯Java.操作方便等优点发挥着很大的作用. 经过一段时间的使用,多少有些心得和技巧,拿出来共享 ...
- eclipse使用SSH框架出现There is no Action mapped for namespace [/] and action name [] associated with context path错误
eclipse使用SSH框架出现There is no Action mapped for namespace [/] and action name [] associated with conte ...
- Java死锁以及命令检测
Java每个对象都有一把锁,当前进程使用对象锁1,没有释放该锁,又想要去获取另一把对象锁2,而对象锁2被另外一个线程持有,没有释放,这就很容易出现死锁 1.死锁实例 public class Dead ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(转)
开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 日程管理 http://ww ...