1. 程式人生 > >Spring/Springboot AOP 自定義註解記錄日誌操作

Spring/Springboot AOP 自定義註解記錄日誌操作

本文采用的方法是使用註解記錄日誌,廢話不多說直接上乾貨。

建立一個自定義@Log日誌標籤

package com.insurance.dao;



import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target
(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Log { /**方法描述*/ public String methodDesc() default ""; }

@Target(ElementType.METHOD)表示標籤註解在方法上,@Documented,@Retention(RetentionPolicy.RUNTIME)這2個標籤不再解釋

建立一個LogAdvice 切面

package com.insurance.dao
; import java.lang.reflect.Method; import java.math.BigDecimal; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework
.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.insurance.dto.PayRequest; import com.insurance.mapper.ApiChannelLogMapper; import com.insurance.model.ApiChannelLog; @Aspect @Component public class LogAdvice { @Autowired private ApiChannelLogMapper apiChannelLogMapper; private static final Logger logger=LoggerFactory.getLogger(LogAdvice.class); /** 配置切入點 */ @Pointcut("@annotation(com.insurance.dao.Log)")//切入到@Log標籤上 public void serviceAspect() { } /** * @Description: 後置通知 */ @After("serviceAspect()") public void after(JoinPoint joinPoint) { logger.info("開始記錄日誌*************************"); PayRequest payRequest=null; try { String targetName = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); Object[] arguments = joinPoint.getArgs(); Class targetClass = Class.forName(targetName); Method[] methods = targetClass.getMethods(); String methodDesc = ""; String params = ""; for (Method method : methods) { if (method.getName().equals(methodName)) { Class[] clazzs = method.getParameterTypes(); if (clazzs.length == arguments.length) { if (!method.isAnnotationPresent(Log.class)) return; methodDesc = method.getAnnotation(Log.class).methodDesc(); // 獲取標籤註解欄位資訊 for (int i = 0; i < arguments.length; i++) { params = params + arguments[i] + (i == arguments.length - 1 ? "" : ","); // 獲取請求引數 } break; } } } //arguments是Object引數,假如你請求方法傳的是PayRequest引數物件 PayRequest payRequest=PayRequest(params); ApiChannelLog apiChannelLog=new ApiChannelLog(); apiChannelLog.setChannel_client(payRequest.getChannel_client); apiChannelLog.setChannel_method(payRequest.getChannel_method); apiChannelLog.setCreateTime(payRequest.getCreateTime); apiChannelLog.setMerchant_sn(payRequest.getMerchant_sn); apiChannelLog.setOrder_no(payRequest.getOrder_no); apiChannelLog.setReq(payRequest.getReq); apiChannelLogMapper.add(apiChannelLog); logger.info("結束記錄日誌*************************"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

建立一個TestService,將@Log注入該類方法上

package com.insurance.service.impl;

import org.springframework.stereotype.Service;

import com.insurance.dao.Log;
import com.insurance.dto.PayRequest;

@Service
public class TestService {  
    @Log(methodDesc="日誌記錄") 
    public void login(PayRequest payRequest) {  
        payRequest.setAppid("1111112");     
    }
}

建立一個控制層


     @RequestMapping("/test")
     @ResponseBody
     public void test(HttpServletResponse response, HttpServletRequest request,HelibaoParam param)throws Exception{
         PayRequest payRequest=new PayRequest();
         payRequest.setMerchantno("12365412");
         payRequest.setUrl("http:www.baidu.com");
         payRequest.setOrderid("1233652");
         testService.login(payRequest);  
         response.getWriter().print("SUCCESS"); 
     }

進行訪問

這裡寫圖片描述

這樣就能實現一個自定義註解標籤AOP記錄日誌功能