package com.jsl.oa.aspect;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
/**
* 业务切面
*
* 对业务进行切入,进行对内容操作的预处理
*
* @since v1.2.0
* @version v1.2.0
* @author xiao_lfeng
*/
@Slf4j
@Aspect
@Component
@RequiredArgsConstructor
public class BusinessAop {
/**
* 在控制器的所有方法执行前执行
*
* @param joinPoint 切入点提供对方法执行的信息
*/
@Before("execution(* com.jsl.oa.controllers.*.*(..))")
public void beforeController(@NotNull JoinPoint joinPoint) {
// 从ServletRequest中获取用户信息
ServletRequestAttributes servletRequestAttributes =
(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (servletRequestAttributes != null) {
HttpServletRequest request = servletRequestAttributes.getRequest();
// 获取方法签名
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Class> declaringType = methodSignature.getDeclaringType();
String methodName = methodSignature.getName();
log.info(
"[CONTROL] 执行 {}:{} 接口 | 地址: [{}]{}",
declaringType.getName(),
methodName,
request.getMethod(),
request.getServletPath()
);
} else {
throw new RuntimeException("无法获取信息");
}
}
/**
* 在服务的所有方法执行前执行
*
* @param joinPoint 切入点提供对方法执行的信息
*/
@Before("execution(* com.jsl.oa.services.impl.*.*(..))")
public void beforeService(@NotNull JoinPoint joinPoint) {
// 获取方法签名
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Class> declaringType = methodSignature.getDeclaringType();
String methodName = methodSignature.getName();
log.info("[SERVICE] 执行 {}:{} 业务", declaringType.getName(), methodName);
}
/**
* 在DAO的所有方法执行前执行
*
* @param pjp 切入点提供对方法执行的信息
*/
@Around("execution(* com.jsl.oa.dao.*.*(..))")
public Object beforeDao(@NotNull ProceedingJoinPoint pjp) throws Throwable {
// 获取方法签名
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
Class> declaringType = methodSignature.getDeclaringType();
String methodName = methodSignature.getName();
Object[] args = pjp.getArgs();
log.info("==>[DAO] 操作 {}:{} 记录", declaringType.getName(), methodName);
if (args.length != 0) {
log.debug("\t> 传入信息:{}", Arrays.toString(args));
}
Object result = pjp.proceed();
log.info("<==[DAO] 返回数据类型 {}", declaringType.descriptorString());
log.debug("\t> 传出信息:{}", result.toString());
return result;
}
}