概述
项目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)可以获取不到。
最后
以上就是顺心玫瑰为你收集整理的切面定义可配置化及重复注解的全部内容,希望文章能够帮你解决切面定义可配置化及重复注解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复