1、pom.xml引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
2.编写切面
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Arrays;
@Aspect // 表明是一个切面类
@Component
public class LogAspect {
Logger log = Logger.getLogger(LogAspect.class);
//进入方法时间戳
private Long startTime;
//方法结束时间戳(计时)
private Long endTime;
/**
* 定义切入点表达式
* 访问修饰符 返回值 包名.包名.包名...类名.方法名(参数列表)
* 权限修饰符可以使用默认 第一个*表示返回值类型 ..表示当前包以及其子包下 第二个*表示任意方法 (..)表示任意参数列表
*/
private final String POINTCUT = "execution(* com.woniuxy.ssm.service.*.*(..))";
public LogAspect() {
}
//前置通知,方法之前执行
@Before(POINTCUT)
public void doBefore(JoinPoint joinPoint) {
startTime = System.currentTimeMillis();
log.info("请求开始时间:" + LocalDateTime.now());
log.info("请求参数 : " + Arrays.toString(joinPoint.getArgs()));
}
//后置通知
@After(POINTCUT)
public void doAfter(JoinPoint joinPoint) {
log.info("Logger-->后置通知,方法名:" + joinPoint.getSignature().getName() + ",方法执行完毕");
}
//返回通知 正常结束时进入此方法
@AfterReturning(returning = "ret", pointcut = POINTCUT)
public void doAfterReturning(Object ret) {
endTime = System.currentTimeMillis();
log.info("请求结束时间 : " + LocalDateTime.now());
log.info("请求耗时 : " + (endTime - startTime));
// 处理完请求,返回内容
log.info("请求返回 : " + ret);
}
//异常通知: 1. 在目标方法非正常结束,发生异常或者抛出异常时执行
@AfterThrowing(pointcut = POINTCUT, throwing = "throwable")
public void doAfterThrowing(Throwable throwable) {
// 保存异常日志记录
log.error("发生异常时间 : " + LocalDateTime.now());
log.error("抛出异常 : " + throwable.getMessage());
}
//环绕通知,必须有返回值,否则程序无法继续往下执行,返回空指针异常
@Around(value = POINTCUT)
public Object doAround(ProceedingJoinPoint jp) throws Throwable {
log.info("权限管理");
//执行目标方法proceed
Object proceed = jp.proceed();
log.info("日志记录");
return proceed;
}
}
3、开户AOP自动代理
<!--开启aop自动代理-->
<aop:aspectj-autoproxy/>