@Aspect与@ControllerAdvice

@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的方法,两者可以结合使用。

 

 

 

你可能感兴趣的:(Spring,Boot,与,Spring,Cloud,Spring)