自定义注解以SpringAOP开发第三方库

    在我们开发自己的第三方框架时经常会使用aop拦截做相关处理,但如果实现灵活的自定义aop拦截呢?有种方式?(在这里主要讲解在springboot环境下的使用)

方案一: 原始社会的 Spring XML 配置实现(如:XML配置aop事物切面等),已out的就先略过;


方案二:在springboot下使用@Configuration配置自定义aop拦截器,以下为一个使用aop做方法调用次数的实现伪代码:

// Advice类

public class CounterAdvice implements MethodInterceptor {

    @Override

    public Object invoke(MethodInvocation invocation) throws Throwable {

        // 拦截处理逻辑....

    }

}

// 配置注入类

@Configuration

public static class CounterAdviceConfiguration {

    @Value("${spring.aop.counter.expression}")

    private String expression;

    @Bean

    public AspectJExpressionPointcutAdvisor counterAdviceAdvisor(CounterAdvice advice) {

        AspectJExpressionPointcutAdvisor advisor = new AspectJExpressionPointcutAdvisor();

        advisor.setExpression(expression);

        advisor.setAdvice(advice);

        return advisor;

    }

    @Bean

    public CounterAdvice counterAdvice() {

        return new CounterAdvice();

    }

}

然后就可以在application.yml中配置 spring.aop.counter.expression 拦截表达式了。



方案三: 类似方案二,但主要区别是使用自定义注解实现配置拦截,以下同样为一个统计方法调用次数的实现伪代码:

// 自定义注解类

@Target({ ElementType.TYPE })

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface CounterBean {

}

// Aspect切面拦截处理类

@Aspect

public class CounterAspect {

    @Pointcut("@within(com.xxx.xx.CounterBean)")  // 关键部分

    public void pointcut() {

    }

    @Around("pointcut()")

    public Object advice(ProceedingJoinPoint joinPoint) throws Throwable {

        // 拦截处理逻辑....

    }

}

// 配置注入类

@Configuration

public static class CounterAspectConfiguration {

    @Bean

    public CounterAspect counterAspect() {

        return new CounterAspect();

    }

}

以上为常见实现springaop的方法,其中用的最多的是方案三,其关键的部分在于使用aop的execution切面拦截表达式,更加详细的语法使用请参考:

SpringAOP @Aspect详细使用规则

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。