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