Sping值AOP实战
不废话,贴代码
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.jxzx.yqby.base.JsonResult;
import org.springframework.beans.factory.annotation.Value;
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;
@Slf4j
@Component
@Aspect
public class FriendChainAspect {
@Value("${aspect.log.value:}")
private String logAspect;
private final String logValue="log";
/**
* 切入点:待增强的方法
* 切入点签名
*/
@Pointcut("execution(public * org.jxzx.phjr.api.controller.friend.*.*(..))")
public void log() {
if (!logValue.equals(logAspect)) {
return;
}
System.out.println("pointCut签名。。。");
}
/**
* 前置通知
*
* @param jp
* @throws Throwable
*/
@Before("log()")
public void deBefore(JoinPoint jp) throws Throwable {
if (!logValue.equals(logAspect)) {
return;
}
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
System.out.println("URL : " + request.getRequestURL().toString());
System.out.println("HTTP_METHOD : " + request.getMethod());
System.out.println("CLASS_METHOD : " + jp);
System.out.println("ARGS : " + Arrays.toString(jp.getArgs()));
}
/**
* 返回通知
*
* @param ret
* @throws Throwable
*/
@AfterReturning(returning = "ret", pointcut = "log()")
public void doAfterReturning(Object ret) throws Throwable {
if (!logValue.equals(logAspect)) {
return;
}
// 处理完请求,返回内容
if (ret instanceof JsonResult) {
JsonResult chain = (JsonResult) ret;
log.info("请求返回的code = {}", JSON.toJSONString(chain.getErrCode()));
log.info("请求返回的httpCode = {}", JSON.toJSONString(chain.getHttpCode()));
log.info("请求返回的message = {}", JSON.toJSONString(chain.getErrMessage()));
log.info("请求返回的status = {}", JSON.toJSONString(chain.getStatus()));
log.info("请求返回的信息 = {}", JSON.toJSONString(chain.getData()));
}
}
/**
* 异常通知
*
* @param jp
* @param ex
*/
@AfterThrowing(throwing = "ex", pointcut = "log()")
public void throwss(JoinPoint jp, Exception ex) {
if (!logValue.equals(logAspect)) {
return;
}
System.out.println("异常通知:方法异常时执行.....");
System.out.println("产生异常的方法:" + jp);
System.out.println("异常种类:" + ex);
}
/**
* 后置通知
*
* @param jp
*/
@After("log()")
public void after(JoinPoint jp) {
if (!logValue.equals(logAspect)) {
return;
}
System.out.println("后置通知:最后且一定执行.....");
}
/**
* 环绕通知,环绕增强,相当于MethodInterceptor
*
* @param pjp
* @return
*/
@Around("log()")
public Object aroundAdvice(ProceedingJoinPoint pjp) {
Object rtValue = null;
try {
//得到方法执行所需的参数
Object[] args = pjp.getArgs();
if (logValue.equals(logAspect)) {
System.out.println("通知类中的aroundAdvice方法执行了。。前置");
}
//明确调用切入点方法(切入点方法)
rtValue = pjp.proceed(args);
if (!logValue.equals(logAspect)) {
return rtValue;
}
System.out.println("通知类中的aroundAdvice方法执行了。。返回");
System.out.println("返回通知:" + rtValue);
return rtValue;
} catch (Throwable e) {
System.out.println("通知类中的aroundAdvice方法执行了。。异常");
throw new RuntimeException(e);
} finally {
System.out.println("通知类中的aroundAdvice方法执行了。。后置");
}
}
}