SpringBoot中使用AOP实现计算Service执行时间

1、增加POM.XML的依赖架包

<!-- 引入 spring aop 依赖 --><dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-aop</artifactId></dependency>

2、编写AOP切面主体类如:LogServiceTakeTime
 1 package com.leecx.aop;
 2
 3 import org.aspectj.lang.JoinPoint;
 4 import org.aspectj.lang.ProceedingJoinPoint;
 5 import org.aspectj.lang.annotation.*;
 6 import org.slf4j.Logger;
 7 import org.slf4j.LoggerFactory;
 8 import org.springframework.stereotype.Component;
 9
10 /**
11  * <p>Title:</p>
12  * <p>Description:service的方法执行需要多少时间统计</p>
13  * <p>Copyright:Copyright (c) 2018</p>
14  * <p>Company:东软集团股份有限公司</p>
15  * CreateDate:2018/4/18 0018 下午 23:09
16  * Author:段美林[[email protected]]
17  * Version:1.0
18  */
19 //申明主体类,定义切面主体类
20 @Aspect
21 @Component
22 public class LogServiceTakeTime {
23
24     private final static Logger log = LoggerFactory.getLogger(LogServiceTakeTime.class);
25
26     @Pointcut("execution(* com.leecx.service..*.*(..))")
27     public void performance(){
28     }
29
30     @Around("performance()")
31     public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable {
32
33         //记录起始时间
34         long begin = System.currentTimeMillis();
35         Object result = "";
36         /** 执行目标方法 */
37         try{
38             result= joinPoint.proceed();
39         }
40         catch(Exception e){
41             log.error("日志记录发生错误, errorMessage: {}", e.getMessage());
42         }
43         finally{
44             /** 记录操作时间 */
45             long took = System.currentTimeMillis() - begin;
46             if (took >= 10000) {
47                 log.error("Service 执行时间为: {}秒", took);
48 //                log.error("Controller 执行时间为: {}毫秒", took);
49             } else if (took >= 5000) {
50                 log.warn("Service 执行时间为: {}秒", took);
51 //                log.warn("Controlle r执行时间为: {}毫秒", took);
52             } else  if (took >= 3000) {
53                 log.info("Service执行时间为: {}秒", took);
54 //                log.info("Controller 执行时间为: {}毫秒", took);
55             }
56             // TODO 日志保存到MongoDB中
57         }
58         return result;
59     }
60
61     @Before("performance()")
62     public void doBefore(JoinPoint joinPoint) throws Throwable {
63         // 接收到请求,记录请求内容
64         log.info("doBefore");
65     }
66
67     @AfterReturning(returning = "ret", pointcut = "performance()")
68     public void doAfterReturning(Object ret) throws Throwable {
69         // 处理完请求,返回内容
70         log.info("doAfterReturning");
71     }
72
73 }
说明:1、在类的主体上加上注解定义切面并申明  @Aspect  定义切面2、@Pointcut("execution(* com.leecx.service..*.*(..))")  定义切入点,一般使用表达式申明切入的范围   如com.leecx.service 包下的所有方法都会被拦截切面到3、@Before:切入点开始执行前处理的方法4、@After:切入点结尾执行的方法5、@AfterReturning:在切入点return数据后执行的方法(一般用于对返回数据的包装)6、@Around:在切入点前后执行的方法7、@AfterThrowing:抛出异常执行的方法

原文地址:https://www.cnblogs.com/yinfengjiujian/p/8878658.html

时间: 2024-08-02 03:40:46

SpringBoot中使用AOP实现计算Service执行时间的相关文章

springboot中的AOP开发

三步: 1.引入springboot-boot-start-aop jar包 <!--springboot与aop集成jar包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 2.开发切面 两个主要的注解:@Configurat

在Spring中使用AOP切面编程

如果有对SpringAOP不太懂的小伙伴可以查看我之前的Spring学习系列博客 SpringBoot的出现,大大地降低了开发者使用Spring的门槛,我们不再需要去做更多的配置,而是关注于我们的业务代码本身,在SpringBoot中使用AOP有两种方式: 一.使用原生的SpringAOP(不是很推荐,但这是最基本的应用) 基原理就是之前写的SpringAOP在web应用中的使用的第三种方式,使用@AspectJ样式注解方式 第1步,引入Aspect的相关依赖 <dependency> <

SpringBoot应用中使用AOP记录接口访问日志

SpringBoot应用中使用AOP记录接口访问日志 本文主要讲述AOP在mall项目中的应用,通过在controller层建一个切面来实现接口访问的统一日志记录. AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP的相关术语 通知(Advice) 通知

SpringBoot中使用LoadTimeWeaving技术实现AOP功能

目录 1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 1.2 JDK实现LTW的原理 1.3 如何在Spring中实现LTW 2. Springboot中使用LTW实现AOP的例子 3. 参考资料 1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 AOP--面向切面编程,通过为目标类织入切面的方式,实现对目标类功能的增强.按切面被织如到目标类中的时间划分,主要有以下几种: 1.运行期织入 这是最常见的,比如在运行期通过为目标类生成动态代理

Springboot 中AOP的使用

面向切面编程(Aspect Oriented Programming) 是软件编程思想发展到一定阶段的产物,是面向对象编程的有益补充.AOP一般适用于具有横切逻辑的场合,如访问控制.事务管理.性能检测等. 日志.异常处理.事务控制等都是一个健壮的业务系统所必须的.但是为了保证系统健壮可用,就要再众多业务方法中反复编写类似的代码,使得原本就很复杂的业务处理代码变得更加复杂.业务功能的开发者还要考两次这些额外的代码是否处理正确,是否有遗漏的地方,如果需要修改日志信息的格式或者安全验证的规则,或者再增

【spring-boot】spring aop 面向切面编程初接触

众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programming,面向切面,AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果.其与设计模式完成的任务差不多,是提供另一种角度来思考程序的结构,来弥补面向对象编程的不足. 通俗点讲就是提供一个为一个业务实现提供切面注入的

Spring boot中使用aop详解

版权声明:本文为博主武伟峰原创文章,转载请注明地址http://blog.csdn.net/tianyaleixiaowu. aop是spring的两大功能模块之一,功能非常强大,为解耦提供了非常优秀的解决方案. 现在就以springboot中aop的使用来了解一下aop. 一:使用aop来完成全局请求日志处理 创建一个springboot的web项目,勾选aop,pom如下: [html] view plain copy print? <?xml version="1.0" e

SpringBoot中异步请求和异步调用(看这一篇就够了)

一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应.一句话:增加了服务器对客户端请求的吞吐量(实际生产上我们用的比较少,如果并发请求量很大的情况下,我们会通过nginx把请求负载到集群服务的各个节点上来分摊请求压力,当然还可以通过消息队列来做请求的缓冲). 2.异步请求的实现 方式一:Servlet方式实现异步请求

springboot中使用自定义线程池ThreadPoolTaskExecutor

java5以后,线程有了很大的变化,在使用上更加方便功能更佳强大,Springboot里面进行了进一步的封装. 我们来看一个例子 package com.executor; import java.util.concurrent.Executor;import java.util.concurrent.RejectedExecutionHandler;import java.util.concurrent.ThreadPoolExecutor; import org.springframewor