最近有個需求,需要統計各個介面、類的方法的執行時間,但是要盡量不影響原來業務,不改變原有**。
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 和邏輯運算子 和!萬用字元 表示匹配任意數量的字元,匹配指定類及其之類 ...