简单两步,spring aop上手即用即会

面向切面思想在于它的干净,对逻辑代码没有任何侵入性,只需要在想要切入的方法或者类之上加上自定义的注解即可。
首先,就是自定义一个注解:

//这里我们定义一个名为 @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;
}

以上!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章