importjava.io.IOException;importjava.lang.reflect.Method;importjava.util.Arrays;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.concurrent.atomic.AtomicBoolean;importjava.util.concurrent.atomic.AtomicReference;importcom.alibaba.fastjson.JSONObject;importorg.apache.commons.lang.StringUtils;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;importorg.aspectj.lang.reflect.MethodSignature;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;
@Aspect
@Componentpublic classLogAdvice {
@Autowiredprivate static final Logger logger=LoggerFactory.getLogger(LogAdvice.class);
@Pointcut("@annotation(注解路径)")public voidserviceAspect() {
}
@After("serviceAspect()")public void after(JoinPoint joinPoint) throwsIOException {
logger.info("开始记录日志*************************");
MethodSignature ms=(MethodSignature) joinPoint.getSignature();
Method method=ms.getMethod();
Log myAnnotation= method.getAnnotation(Log.class);
Map paramsMap = new HashMap<>();
String[] argNames= ((MethodSignature)joinPoint.getSignature()).getParameterNames(); //参数名
Object[] argObjects = joinPoint.getArgs(); //参数
List argNameList =Arrays.asList(argNames);
resolveArgs(joinPoint,argNameList,argObjects,paramsMap);
saveToDbLog(myAnnotation,paramsMap);
}
@AfterReturning(pointcut= "serviceAspect()",returning="returnValue")public voidafterreturningJoinPoint(JoinPoint joinPoint ,Object returnValue){//System.out.println("后置通知"+joinPoint+"返回值"+returnValue);
}
@Around("serviceAspect()")public Object around(ProceedingJoinPoint pjp) throwsThrowable{
Object object=pjp.proceed();returnobject;
}public static void saveToDbLog(Log myAnnotation, MapparamsMap){
String description=myAnnotation.description();
description=handleAnnotation(description,paramsMap);
System.out.println(description);
//TODO db操作
}public static String handleAnnotation(String description, MapparamsMap){
AtomicReference result = new AtomicReference<>(description);if(StringUtils.isBlank(description)){returnresult.get();
}
paramsMap.entrySet().parallelStream().forEach(p->{if(result.get().contains(p.getKey())){
result.set(result.get().replaceAll(p.getKey(), p.getValue()+ ""));
}
});returnresult.get();
}public static void resolveArgs(JoinPoint joinPoint, ListargNameList, Object[] argObjects,
MapparamsMap){for(int i = 0; i < argNameList.size(); i++){
Class> classo =argObjects[i].getClass();if(handleClassType(classo.getName())){
paramsMap.put(argNameList.get(i),joinPoint.getArgs()[i]);continue;
}JSONObject object=(JSONObject) JSONObject.toJSON(joinPoint.getArgs()[i]);
object.keySet().parallelStream().forEach(p->{
paramsMap.put(p,object.get(p));
});
}
}public static T get(Classclz,Object o){if(clz.isInstance(o)){returnclz.cast(o);
}return null;
}public static booleanhandleClassType(String name){
AtomicBoolean result= new AtomicBoolean(false);
String[] className= {"String","Integer","Long","int","float","double","char"};
Arrays.asList(className).forEach(n->{if(name.contains(n)) {
result.set(name.contains(n));
}
});returnresult.get();
}
}