业务场景:通过aop的环绕模式,做请求外部接口的请求和响应日志收集。其中不同接口入参不一样,但是我需要获取一个唯一标识作为业务id。
1.定义一个注解:注入到方法
package com.jd.car.laserbeak.infrastructure.jd.jsf.logrecordaop;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author xyd
* @description:
* @date 2020/2/24
*/
@Target(ElementType.METHOD)//我是控制到方法,这个根据自己实际业务选
@Retention(RetentionPolicy.RUNTIME)//什么时候切,这个都可以根据业务定
public @interface LogRecord {
String flag() default "";//用来获取入参的标识(每个业务的入参属性不一样)
}
2.切面:可以根据自己业务定义自己切面的范围,和用什么方式advice
package com.jd.car.laserbeak.web.config;
import com.alibaba.fastjson.JSON;
import com.jd.car.laserbeak.service.requsetlog.RequsetLogService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
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;
/**
* @author xyd
* @description: 日志记录切面处理类
* @date 2020/2/24
*/
@Aspect
@Component
public class LogRecordAspect {
private static Logger LOG = LoggerFactory.getLogger(LogRecordAspect.class);
@Autowired
private RequsetLogService requestLogServie;
//切的地方。我是对我的注解切入。我们可以根据需要定义作用域 @Pointcut("@annotation(com.jd.car.laserbeak.infrastructure.jd.jsf.logrecordaop.LogRecord)")
public void pointcut() {
}
@Around("pointcut()")
public Object around(ProceedingJoinPoint point) {
Object result = null;
String message;
try {
// 执行方法
result = point.proceed();
//成功后,返回的业务信息获取。用作存日志使用
messa