1. 程式人生 > 其它 >專案中aop記錄日誌的實現,使用@annoation註解的切入點表示式

專案中aop記錄日誌的實現,使用@annoation註解的切入點表示式

技術標籤:aopaop

定義切面和切入點方法,使用註解的方式
@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); }