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执行时间的更多相关文章

  1. Springboot中使用AOP统一处理Web请求日志

    title: Springboot中使用AOP统一处理Web请求日志 date: 2017-04-26 16:30:48 tags: ['Spring Boot','AOP'] categories: ...

  2. SpringBoot图文教程5—SpringBoot 中使用Aop

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...

  3. 在SpringBoot中配置aop

    前言 aop作为spring的一个强大的功能经常被使用,aop的应用场景有很多,但是实际的应用还是需要根据实际的业务来进行实现.这里就以打印日志作为例子,在SpringBoot中配置aop 已经加入我 ...

  4. 编写SpringBoot 中的AOP

    编写SpringBoot 中的AOP 在程序开发的过程中会使用到AOP的思想,面向切面进行开发,比如登录的验证,记录日志等等-频繁需要操作的步骤,在遇到这种情况时就要使用Spring 的AOP了 Sp ...

  5. springboot 中使用AOP

    网上关于AOP的例子好多,各种名词解释也一大堆,反正名词各种晦涩,自己写个最最最简单的例子入门mark一下,以后再深入学习. maven依赖 <dependency> <groupI ...

  6. SpringBoot中使用AOP打印接口日志的方法(转载)

    前言 AOP 是 Aspect Oriented Program (面向切面)的编程的缩写.他是和面向对象编程相对的一个概念.在面向对象的编程中,我们倾向于采用封装.继承.多态等概念,将一个个的功能在 ...

  7. spring-boot中的AOP

    public class User { private Integer id; private String username; private String note; public User(In ...

  8. springboot中使用aop技术

    aop是面向切面编程的意思,它可以需要先选择一些切入点,然后对这些切入点进行拦截,注入统一的代码逻辑,这也是解耦的一种方式,也是为了避免重复的代码,让开发人员把关注点放在业务上. 引用包 'org.s ...

  9. SpringBoot图文教程6—SpringBoot中过滤器的使用

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文系列教程技术大纲 鹿老师的Java笔记 SpringBo ...

随机推荐

  1. 关于WCF引用方式之WCF服务寄宿控制台

    1.创建解决方案WCFService 依次添加四个项目,如上图,Client和Hosting为控制台应用程序,Service和Service.Interface均为类库. 2.引用关系 Service ...

  2. VMware下安装的Mac OS X如何修改显示分辨率 (转)

    我在Win7下利用VMware安装了苹果的OS x 10.8系统,安装成功启动后,发现分辨率为1024*768,而宿机的分辨率是1440*900,我想让虚拟机全屏显示,也就是想在雪豹下屏幕的分辨率也能 ...

  3. 关于vim搜索/替换功能的两条配置

    之前是直接照着这篇的配置的强大的vim配置文件 自己也只是对vim新建文件修改文件的哪个函数SetTitle()做了点修改,毕竟用vim只写C/C++和python.shell. 没想到今天在用vim ...

  4. boost 编译 安装

    首先到 boost.org 下载 boost_1_54_0.tar.gz 上传到 linux 环境下 解压缩 给解压缩出来的文件斌权限 chmod 777 ./* 执行己写好的 shell脚本 boo ...

  5. MSYS2环境搭建

    本机环境:Windows XP 32位MSYS2地址:http://sourceforge.net/projects/msys2/ 下载32位版本,地址:http://sourceforge.net/ ...

  6. 以太坊(二)安装Solidity编译器

    官方地址:https://solidity.readthedocs.io/en/develop/installing-solidity.html 推荐使用  remix   快速学习solidity  ...

  7. POJ1159解题心得

    题目:http://poj.org/problem?id=1159 刚开始,从样例的特征去思考.总让我从回文数的角度去思考,想出几个方案,可都用了数据去检验,发现不行.如:ABCDDCB,BACDCA ...

  8. Android:自定义Sqlite数据库路径

    默认的sqlite数据库是放在/data/data/database目录下的,今天看腾讯云IM的demo发现再该路径下找不到它存放消息的数据库,找了下后发现居然是放在/data/data/files目 ...

  9. 脱壳系列(一) - CrypKeySDK 壳

    程序: 运行 用 PEiD 载入程序 PEid 显示找不到相关的壳 脱壳: 用 OD 载入程序 这个是壳的入口地址 因为代码段的入口地址为 00401000 这三个是壳增加的区段 按 F8 往下走程序 ...

  10. php switch

    php switch switch用法类型与if,但是为了方便 不用写那么多个elseif.所以要判断 多个变量的时候我们可以使用switch <?php $email="admin& ...