/**
* AOP通知:
* 1. 前置通知:在方法調(diào)用之前執(zhí)行
* 2. 后置通知:在方法正常調(diào)用之后執(zhí)行
* 3. 環(huán)繞通知:在方法調(diào)用之前和之后,都分別可以執(zhí)行的通知
* 4. 異常通知:如果在方法調(diào)用過程中發(fā)生異常,則通知
* 5. 最終通知:在方法調(diào)用之后執(zhí)行
*/
/**
* 切面表達(dá)式:
* execution 代表所要執(zhí)行的表達(dá)式主體
* 第一處 * 代表方法返回類型 *代表所有類型
* 第二處 包名代表aop監(jiān)控的類所在的包
* 第三處 .. 代表該包以及其子包下的所有類方法
* 第四處 * 代表類名,*代表所有類
* 第五處 *(..) *代表類中的方法名,(..)表示方法中的任何參數(shù)
*
* @param joinPoint
* @return
* @throws Throwable
*/
Demo 查看service 執(zhí)行的時間
@Aspect
@Component
public class ServiceLogAspect {
public static final Logger log =
LoggerFactory.getLogger(ServiceLogAspect.class);
@Around("execution(* com.imooc.service.impl..*.*(..))")
public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("====== 開始執(zhí)行 {}.{} ======",
joinPoint.getTarget().getClass(),
joinPoint.getSignature().getName());
// 記錄開始時間
long begin = System.currentTimeMillis();
// 執(zhí)行目標(biāo) service
Object result = joinPoint.proceed();
// 記錄結(jié)束時間
long end = System.currentTimeMillis();
long takeTime = end - begin;
if (takeTime > 3000) {
log.error("====== 執(zhí)行結(jié)束,耗時:{} 毫秒 ======", takeTime);
} else if (takeTime > 2000) {
log.warn("====== 執(zhí)行結(jié)束,耗時:{} 毫秒 ======", takeTime);
} else {
log.info("====== 執(zhí)行結(jié)束,耗時:{} 毫秒 ======", takeTime);
}
return result;
}
}