SpringBoot实现AOP功能

最近公司内部业务线做拆分,涉及到一批老接口升级改造,不能确定这批老接口直接给出”停用提示“是否影响使用,于是考虑在接口上加上开关,如果影响业务则立刻切换回老逻辑,统计了下大概有7个文件,每个文件平均5个接口,算下来还是有不小的工作量,并且如果直接改动接口会造成代码的侵入,后续维护成本会更高,于是这里可以考虑参考Spring的AOP功能。

目录结构如图所示:

SpringBoot实现AOP功能_第1张图片

这里有两个实现的方法一种是采用传统的切面表达式的方式处理,另一种是采用自定义注解

切面表达式

@Aspect
@Component
public class XXXXAspect {

    @Value("${flag:false}")
    private Boolean flag;

    @Pointcut("execution(public * com.xxxx.crm.xxxxx.controller.*.*(..)))")
    public void Xxxxxx() {
    }

    @Around("Xxxxxx()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        if (!flag:false) {
            return new Resp(-1, "请升级到最新版本App查看全部信息");
        }
        return pjp.proceed();
    }
}

自定义注解

@Aspect
@Component
public class XXXXAspect {

    @Value("${flag:false}")
    private Boolean flag;

    @Pointcut("@annotation(com.xxx.crm.xxx.annotation.MyAnnotation) @within(com.xxx.crm.xxx.annotation.MyAnnotation)")
    public void Xxxxxx() {
    }

    @Around("Xxxxxx()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        if (!flag:false) {
            return new Resp(-1, "请升级到最新版本App查看全部信息");
        }
        return pjp.proceed();
    }
}

controller上使用注解

SpringBoot实现AOP功能_第2张图片

注意:采用自定义注解定义切点时,如果是在类上使用注解,则表达式上需要带上@within表示用于匹配所有持有指定注解类型内的方法;否则当请求进来访问某个方法时,切面不会生效。如果将注解加到具体方法上,则只需要@annotation注解。

你可能感兴趣的:(#,SpringBoot)