Spring/Springboot AOP 自定義註解記錄日誌操作
阿新 • • 發佈:2018-12-27
本文采用的方法是使用註解記錄日誌,廢話不多說直接上乾貨。
建立一個自定義@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記錄日誌功能