使用Spring AOP添加统计时间的功能

简介: 使用Spring AOP添加统计时间的功能

最近有个需求,需要统计各个接口、类的方法的执行时间,但是要尽量不影响原来业务,不改变原有代码。

第一想到的就是使用AOP的方式来做,翻了一些资料,终于把问题解决了。这里整理一下:

Spring提供了4种实现AOP的方式:

1.经典的基于代理的AOP

2.@AspectJ注解驱动的切面

3.纯POJO切面

4.注入式AspectJ切面

我这里讲到的是使用@AspectJ注解驱动的方式,其他的可以自行研究一下。

首先我的项目是使用SpringMVC+Spring+Mybatis的结构,使用aop的方式,需要修改一下SpringMVC.xml配置。

1、增加AOP的XML命名空间和声明相关schema

命名空间:

xmlns:aop="http://www.springframework.org/schema/aop"

schema声明:

http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd


2、然后添加如下配置:

<!-- 开启切面编程功能 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>

之后是编写我们的切面类:

package com.mysite.common.system;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import com.mysite.common.entity.TimeEntity;
import com.mysite.common.util.SendHearbeatUtil;
@Component
@Aspect
public class StatisticHelper {
private long startTime = 0;
  
  //对com.mysite.test包下面所有子包所有public方法有效,此方法不能有返回值
  @Pointcut("execution(public * com.mysite.test..*.*(..))")
  public void recordTime() {
  }
  @Before("recordTime()")
  public void before(JoinPoint jp) {
  startTime = System.currentTimeMillis();//获取访问时的当前时间
  }
  @AfterReturning("recordTime()")
  public void afterReturning(JoinPoint jp) {
  long process = System.currentTimeMillis() - startTime;//计算出调用方法返回的用时
  String className = jp.getThis().toString();//获取类名
  String methodName = jp.getSignature().getName(); // 获得方法名
  TimeEntity e = new TimeEntity();
  e.setClazz(className);
  e.setMethod(methodName);
  e.setTime(process);
  SendHearbeatUtil.pq.add(e);//把timeEntity放入SendHearbeatUtil中的队列中待处理
  }
}


这样我们的切面程序就已经完成。

在我们访问com.mysite.test包下面类的方法时,会启用切面统计。

Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合.

args()
@args()
execution()
this()
target()
@target()
within()
@within()
@annotation

比如 @Pointcut("execution(public * com.mysite.test..*.*(..))")  可以写成:

@Pointcut("within(com.mysite.test..*)")

如果需要对多个包进行AOP,可以写成

@Pointcut("execution(public * com.mysite.test1..*.*(..)) or execution(public * com.mysite.test2..*.*(..))")

或者

@Pointcut("execution(public * com.mysite.test1..*.*(..)) || execution(public * com.mysite.test2..*.*(..))")


编写切面类的要点

@Aspect放在类头上,把这个类作为一个切面。

@Pointcut放在方法头上,定义一个可被别的方法引用的切入点表达式。

5种通知:

1、@Before,前置通知,放在方法头上。

2、@After,后置【finally】通知,放在方法头上。

3、@AfterReturning,后置【try】通知,放在方法头上,使用returning来引用方法返回值。

4、@AfterThrowing,后置【catch】通知,放在方法头上,使用throwing来引用抛出的异常。

5、@Around,环绕通知,放在方法头上,这个方法要决定真实的方法是否执行,而且必须有返回值。


相关文章
|
1月前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
|
2月前
|
XML 安全 Java
|
14天前
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
73 25
|
14天前
|
XML 安全 Java
Spring AOP—深入动态代理 万字详解(通俗易懂)
Spring 第四节 AOP——动态代理 万字详解!
66 24
|
2月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
1月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
81 8
|
2月前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
74 14
|
3月前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
111 5
|
3月前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
3月前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
61 5