使用Spring AOP新增統計時間的功能

2021-07-23 07:45:06 字數 2273 閱讀 9209

最近有個需求,需要統計各個介面、類的方法的執行時間,但是要盡量不影響原來業務,不改變原有**。

spring提供了4種實現aop的方式: 

1.經典的基於**的aop 

2.@aspectj註解驅動的切面 

3.純pojo切面 

4.注入式aspectj切面

我這裡講到的是使用@aspectj註解驅動的方式,其他的可以自行研究一下。

首先我的專案是使用springmvc+spring+mybatis的結構,使用aop的方式,需要修改一下springmvc.xml配置。

1、增加aop的xml命名空間和宣告相關schema 

命名空間: 

xmlns:aop=""

schema宣告:

/spring-aop-3.2.xsd

2、然後新增如下配置:

之後是編寫我們的切面類:

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

@before("recordtime()")

public void before(joinpoint jp)

@afterreturning("recordtime()")

public void afterreturning(joinpoint jp)

}

這樣我們的切面程式就已經完成。

在我們訪問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,環繞通知,放在方法頭上,這個方法要決定真實的方法是否執行,而且必須有返回值。

使用Spring AOP來統計方法的執行時間

最簡單 粗暴的方法是給各個需要統計的方法開始和結尾處加的時間戳,然後差值計算結果即可,如下 html view plain copy long starttime system currenttimemillis 業務 long endtime system currenttimemillis 這樣...

Spring Aop基礎使用

說到spring,想必大家一定就馬上想到了,哦spring不就是幫助管理bean物件,封裝資料源,提供事務管理的東西麼。的確,平常在使用spring的時候,用到最多的就是spring提供的這些功能了,其實spring還有乙個挺好的東西,或許大家平常用得少一些,他就叫aop。什麼aop,這是什麼玩意兒...

springAOP使用詳情

aop分為兩種方式 xml配置和註解 aspect,pointcut和 advice pointcut expression 切面表示式 指示器 designators execution 和其他 萬用字元 wildcards 和邏輯運算子 和!萬用字元 表示匹配任意數量的字元,匹配指定類及其之類 ...