專案中aop記錄日誌的實現,使用@annoation註解的切入點表示式
阿新 • • 發佈:2021-01-30
定義切面和切入點方法,使用註解的方式
@Pointcut("@annotation(com.cy.pj.common.annotation.RequiredLog)") //@annotstion內定義自定義註解使用的位置
@Aspect
@Component
public class SysLogAspect {
private Logger log=LoggerFactory.getLogger(SysLogAspect.class);
@Autowired
private SysLogService sysLogService;
@Pointcut( "@annotation(com.cy.pj.common.annotation.RequiredLog)")
public void logPointCut(){}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint //連線點
jointPoint) throws Throwable{
long startTime=System.currentTimeMillis();
//執行目標方法(result 為目標方法的執行結果)
Object result=jointPoint.proceed( );
long endTime=System.currentTimeMillis();
long totalTime=endTime-startTime;
log.info("方法執行的總時長為:"+totalTime);
定義方法傳入切入點引數和方法執行耗時時間
saveSysLog(jointPoint,totalTime);
return result;
}
定義方法進行日誌記錄
private void saveSysLog(ProceedingJoinPoint point,
long totleTime) throws NoSuchMethodException,
SecurityException, JsonProcessingException{
//1.獲取日誌資訊
MethodSignature ms= (MethodSignature)point.getSignature();
Class<?> targetClass=point.getTarget().getClass();
String className=targetClass.getName();
//獲取介面宣告的方法
String methodName=ms.getMethod().getName();
Class<?>[]
parameterTypes=ms.getMethod().getParameterTypes();
//獲取目標物件方法(AOP 版本不同,可能獲取方法物件方式也不同)
Method targetMethod=targetClass.getDeclaredMethod(
methodName,parameterTypes);
//獲取使用者名稱,學完 shiro 再進行自定義實現,沒有就先給固定值
String username=ShiroUtils.getPrincipal().getUsername();
//獲取方法引數
Object[] paramsObj=point.getArgs();
System.out.println("paramsObj="+paramsObj);
//將引數轉換為字串
String params=new ObjectMapper()
.writeValueAsString(paramsObj);
//2.封裝日誌資訊
SysLog log=new SysLog();
log.setUsername(username);//登陸的使用者
//假如目標方法物件上有註解,我們獲取註解定義的操作值
RequiredLog requestLog=
targetMethod.getDeclaredAnnotation(RequiredLog.class);
if(requestLog!=null){
log.setOperation(requestLog.value());
}
log.setMethod(className+"."+methodName);//className.methodName()
log.setParams(params);//method params
log.setIp(IPUtils.getIpAddr());//ip 地址
log.setTime(totleTime);//
log.setCreateDate(new Date());
//3.儲存日誌資訊
sysLogService.saveObject(log);
}