Spring & JVM

自定义注解以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详细使用规则]()

留言

您的电子邮箱地址不会被公开。