切面定义可配置化及重复注解

项目https://gitee.com/xxssyyyyssxx/validation在这两个方面进行了探讨。

1.切面自定义

一般地,切面都是这样定义的,由于@Pointcut无法通过${}注入,所以这个类很难框架化,都需要在业务方法中写,比较麻烦,下面记录一种可以配置此值的方式。

@Aspect
@Component
class ParamValidateAspect implements Ordered , ApplicationContextAware{
    private ApplicationContext applicationContext;


    @Pointcut("execution(public * top.jfunc.validation.controller..*.*(..))")
    public void webParamValid(){}

    @Around(value = "webParamValid()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        //目标方法
        Method method = AnnotationUtil.getMethod(pjp);
        ValidateUtil.validateJoinPointParams(applicationContext , method , pjp.getArgs());
        return pjp.proceed();
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

1). 首先定义切面

class ParamValidateAdvice implements MethodInterceptor , ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        Method method = invocation.getMethod();
        ValidateUtil.validateJoinPointParams(applicationContext , method , invocation.getArguments());
        return invocation.proceed();
    }
}

2).再配置advisor,validation.aspect.pointcut就是可以配置的了。

@Configuration
class ParamValidateAdvisorConfig {

    @Value("${validation.aspect.pointcut}")
    private String pointcut;

    @Bean
    public AspectJExpressionPointcutAdvisor configAdvisor() {
        AspectJExpressionPointcutAdvisor advisor = new AspectJExpressionPointcutAdvisor();
        advisor.setExpression(pointcut);
        advisor.setAdvice(paramValidateAdvice());
        return advisor;
    }

    @Bean
    public ParamValidateAdvice paramValidateAdvice(){
        return new ParamValidateAdvice();
    }
}

3).再通过Enable注解或者Import注入此类即可。

参考: https://www.jianshu.com/p/856d92a64ae9

2.重复注解

重复注解是从JDK1.8开始支持的,通过@Repeatable注解容器,一个典型的例子是 @Scheduled和@Schedules

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Validatedes.class)
public @interface Validated {
    Class<? extends Validator>[] value();
}
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validatedes {

	Validated[] value();

}

这样就可以在方法上添加多个@Validated注解,也可以使用@Validatedes包裹起来。

在获取的时候如果只有一个@Validated, method.getAnnotation(Validated.class)可以获取到,

而如果使用的@Validatedes或者有多个@Validated,method.getAnnotation(Validatedes.class)可以获取到,而method.getAnnotation(Validated.class)可以获取不到。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值