当框架提供的注解不满足于理论开发需要时,须要对其进行扩大。

@Target :指定注解能够用于:字段、注解、参数。

  • ElementType选项阐明:
CONSTRUCTOR:用于形容结构器FIELD:用于形容域LOCAL_VARIABLE:用于形容局部变量METHOD:用于形容办法PACKAGE:用于形容包PARAMETER:用于形容参数TYPE:用于形容类、接口(包含注解类型) 或enum申明

@Retention :指定生命周期。

  • RetentionPolicy 阐明:
SOURCE:在源文件中无效(源文件保留)CLASS:在class文件中无效(class保留)RUNTIME:在运行时无效(运行时保留)

@Documented: 使得该注解 javadoc工具记录

@Constraint :指定验证器,实现类。~~~~

groups()payload()是自定义效验注解必须的内容。

List接口是可选的,同一个效验注解在一个字段应用屡次,须要应用@List

简略举例:

  • 校验注解
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})@Retention(RetentionPolicy.RUNTIME)@Documented@Constraint(validatedBy = SizeValidator.class)public @interface SizeValid {    //谬误提示信息,必须存在    String message() default "";        long max();        long min() default 0;    //分组,必须存在    Class<?>[] groups() default {};    //负载,必须存在    Class<? extends Payload>[] payload() default {};    //多个分组时应用    @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})    @Retention(RetentionPolicy.RUNTIME)    @Documented    public @interface List {        SizeValid[] value();    }}
  • 实现类

ConstraintValidator<A, T>接口: A是自定义效验注解,T是反对效验的数据类型。
initialize():初始化验证器相干内容。
isValid():理论验证办法。

@Slf4jpublic class SizeValidator implements ConstraintValidator<SizeValid, String> {    private long min;    private long max;    /**匹配双字节字符正则表达式*/    private static final String REGEX = "[^\\x00-\\xff]";    /**     * 获取注解属性的值     *     * @param constraintAnnotation     */    @Override    public void initialize(NameValid constraintAnnotation) {        min = constraintAnnotation.min();        max = constraintAnnotation.max();    }    /**     * @param value     * @param context     * @return 是否通过验证     */    @Override    public boolean isValid(String value, ConstraintValidatorContext context) {        if(value == null) return true;        long length = value.replaceAll(REGEX, "aa").length();        return min <= length && max >= length;    }}