package com.example.demo.qin;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.interfacecustom.custominterface;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Aspect
@Component
public class Aspecttest {
private static final Logger logger= LoggerFactory.getLogger(Aspecttest.class);
ThreadLocal<Long> startTime= new ThreadLocal<>();
@Pointcut("@annotation(com.example.demo.interfacecustom.custominterface)")
public void add() {
}
@After("add()")
public void after(JoinPoint joinPoint) {
ServletRequestAttributes ra =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = ra.getRequest();
logger.info("<====================================================================");
logger.info("请求来源: => " + request.getRemoteAddr());
logger.info("请求URL: " + request.getRequestURL().toString());
logger.info("请求方式: " + request.getMethod());
logger.info("响应方法: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
logger.info("请求参数 : " + Arrays.toString(joinPoint.getArgs()));
logger.info("---------------------------------------------------------------------");
startTime.set(System.currentTimeMillis());
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
//获取全类方法名
System.out.println(method);
custominterface annotation = method.getAnnotation(custominterface.class);
System.out.println(annotation.name());
}
@AfterReturning(pointcut = "add()",returning = "rst")
public void afterReturning(JoinPoint joinPoint,Object rst){
System.out.println("方法执行完执行.....afterReturning");
logger.info("耗时(毫秒) : " + (System.currentTimeMillis() - startTime.get()));
logger.info("返回数据: {}", JSONObject.toJSONString(rst));
logger.info("====================================================================>");
}
@AfterThrowing(pointcut = "add()",throwing = "a")
public String throwing(Throwable a){
System.out.println("看看是什么异常"+a);
Map<String,Object>map= new HashMap<>();
map.put("code",0);
map.put("msg","网络异常");
return JSONObject.toJSONString(map);
}
}
通过requestcontextholder获取request ,获取相应的参数
controller
package com.example.demo.qin; import com.example.demo.interfacecustom.AnontionTest; import com.example.demo.interfacecustom.custominterface; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class qincotroller { @Autowired test2 test2; @RequestMapping("hell") @custominterface(name = "dd" ) public String test1(@RequestParam(value = "name",defaultValue = "张三") String name,@RequestParam(value = "code",defaultValue = "em001") String code){ AnontionTest te= new AnontionTest(); test2.add(); System.out.println(te.getName()); String a=null; if(a.equals("a")) System.out.println(1234); return "helloword"; } }
自定义注解
package com.example.demo.interfacecustom; import java.lang.annotation.*; @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface custominterface { String name() ; }
后补 aop入参出参打印
package com.stylefeng.guns.rest.common.aop; import com.stylefeng.guns.rest.common.util.CustomAnnotation; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.lang.reflect.Method; import java.util.Arrays; /** * @program: local_new1 * @description: 输出入参出参 * @author: Mr.qin * @create: 2018-12-24 09:33 **/ @Component @Aspect public class CustomAnnotationAop { private Logger log = LoggerFactory.getLogger(this.getClass()); ThreadLocal<Long> starting= new ThreadLocal<>(); @Pointcut("@annotation(com.stylefeng.guns.rest.common.util.CustomAnnotation)") public void param() { } ; @Before("param()") public void beforecustom(JoinPoint point) { Object result=null; String value=null; starting.set(System.currentTimeMillis()); long start = System.currentTimeMillis(); //获取方法参数 Object[] args = point.getArgs(); String requsetParam = Arrays.toString(args); //获取自定义注解的参数 value = annotation(point); log.info(value+"入参"+requsetParam); } @AfterReturning(pointcut = "param()",returning = "result") public void afterCustom(JoinPoint joinpoint,Object result){ String value = annotation(joinpoint); Long bgintime = starting.get(); starting.remove(); Long endtime=System.currentTimeMillis(); log.info(value+"出参"+result.toString()+"总共执行时长" + (endtime - bgintime) + " 毫秒"); } //抽取获取自定义注解的value值 public String annotation(JoinPoint joinpoint){ MethodSignature signature = (MethodSignature) joinpoint.getSignature(); Method method = signature.getMethod(); CustomAnnotation annotation = method.getAnnotation(CustomAnnotation.class); String value = annotation.value(); return value; } }
cotrolleradvice 全局异常
package com.stylefeng.guns.rest.common.aop; import com.stylefeng.guns.rest.common.exception.CustomException; import com.stylefeng.guns.rest.common.util.ResultData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; /** * @program: local_new1 * @description: 我的自定义拦截(全局异常拦截,(customexception)带有controller) * @author: Mr.qin * @create: 2018-12-21 17:54 **/ @ControllerAdvice public class CustomExceptionHadler { private Logger log = LoggerFactory.getLogger(this.getClass()); @ExceptionHandler({CustomException.class}) @ResponseBody public ResultData customException(CustomException ce){ log.info("自定义业务异常"+ce); return new ResultData(0,ce.getMessage()); } /** * 拦截未知的运行时异常 */ @ExceptionHandler(RuntimeException.class) @ResponseBody public ResultData notFount(RuntimeException e) { log.error("运行时异常:", e); return new ResultData(0,"系统异常"); } }
https://blog.csdn.net/heirenheiren/article/details/36634497
https://blog.csdn.net/luanlouis/article/details/51095702