面向切面思想在于它的干净,对逻辑代码没有任何侵入性,只需要在想要切入的方法或者类之上加上自定义的注解即可。
首先,就是自定义一个注解:
//这里我们定义一个名为 @MyPointer 的注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})//只能在方法上使用此注解
public @interface MyPointer{
}
定义好一个注解之后呢,我们就可以定义我们这里的切点类
这里呢,我罗列一下我们常用的切面方法:
Before(前) org.apringframework.aop.MethodBeforeAdvice
After-returning(返回后) org.springframework.aop.AfterReturningAdvice
After-throwing(抛出后) org.springframework.aop.ThrowsAdvice
Arround(周围) org.aopaliance.intercept.MethodInterceptor
Introduction(引入) org.springframework.aop.IntroductionInterceptor
不同的方法有不同的参数,比如下面的@AfterThrowing有一个throwing="e"的参数,传过来的就是我们切入的方法的报错信息。
而@AfterReturning会有一个returning="res"的参数,是方法的返回值。
接下来上代码:
@Aspect
@Component
@Slf4j
public class ModelViewAspect {
//设置切入点:这里直接拦截被@MyPointer注解的方法
@Pointcut("@annotation(com.XXX.XXX.MyPointer)")
public void pointcut() { }
/**
* 当有MyPointer的注解的方法抛出异常的时候,做如下的处理
*/
@AfterThrowing(pointcut="pointcut()",throwing="e")
public void afterThrowable(Throwable e) {
log.error("切面发生了异常:", e);
if(e instanceof CustomException){
throw ModelViewException.transfer((CustomException) e);
}
}
}
接下来只需要将定义好的注解放在你要切入的程序的位置即可。
@MyPointer
@GetMapping("/hallo")
public String index(Model model) {
return model;
}
以上!