@Aspect
@Aspect用于实现Spring AOP,可以在被调用的方法执行前、执行后增加自定义的逻辑,Aspect的使用很简单,如下:
1、创建一个Aspect类(就是一个普通的类),在类前面加入如下两个注解:
@Aspect
@Component
2、创建切点
//切点
@Pointcut("execution(public * com.xxx.xxxx.controller..*.*(..))")
public void yourPointcutName() {
}
可以根据需要创建任意多个切点,切点通常是一个空的方法,仅用于指定该切点对应的被织入方法(可以通过正则表达式匹配)
3、方法调用前
@Before("yourPointcutName()")
public void callBeforexxx(JoinPoint joinPoint) {
//在被调用的方法之前执行这里的代码
}
4、方法调用后
@AfterReturning(returning = "ret", pointcut = "yourPointcutName()")
public void callAfterReturningxxx(JoinPoint joinPoint,Object ret) {
//在被调用的方法之后执行这里的代码
}
通过joinPoint可以获取被调用方法的入参,ret可以获取被调用方法的返回值。
可以在调用前记下当前时间,调用后统计接口的响应时间,注意不要用普通的全局变量,因为spring默认是单例的,需要使用ThreadLocal来实现,因为一个请求是同一个线程。
@ControllerAdvice
@ControllerAdvice用于拦截Controller的接口,比如当接口抛出异常时,可以被拦截,然后返回指定的报文(如错误信息、错误码),使用如下:
1、创建一个类,类外面加上注解:@ControllerAdvice
2、异常处理方法
@ResponseBody
@ExceptionHandler(value = XxxxException.class)
public DataOutput errorHandler(XxxxException e) {
DataOutput output = new DataOutput();
output.setCode(e.getCode());
output.setMsg(e.getMsg());
return output;
}
DataOutput是Controller接口的返回类型,可以任意自定义,当接口被调用抛出未捕获的异常XxxxException时,会触发该方法,由该方法返回指定结果,而不是Spring默认返回500之类的错误信息。
执行完@ControllerAdvice的异常处理方法后,依然会进入@AfterReturning的方法,两者可以结合使用。