自定义注解的实现

126 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情

前面我们讲解了注解实现参数的校验,这篇文章我们具体的了解一下,如何自定义我们自己的注解。来完整实现自定义注解并使用!

我们这里实现一个常用的校验,身份证信息的校验

@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = IdentityConstraintValidator.class)
public @interface IdentityNo {
    String message() default "身份证号码不符合规则";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

我们自定义注解IdentityNo,磨人的提示信息是“身份证号码不符合规则”,

@Retention: 指定注解的生命周期(源码、class文件、运行时),我们这里标注的是运行时的处理方式,

●   RetentionPolicy .SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
●   RetentionPolicy .CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。
●   RetentionPolicy .RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式

@Target:指定注解使用的目标范围(类、方法、字段等),我们选择的是FIELD

● ElementType.CONSTRUCTOR : 用于描述构造器。
● ElementType.FIELD : 成员变量、对象、属性(包括enum实例)。
● ElementType.LOCAL_VARIABLE: 用于描述局部变量。
● ElementType.METHOD :  用于描述方法。
● ElementType.PACKAGE : 用于描述包。
● ElementType.PARAMETER :用于描述参数。
● ElementType.ANNOTATION_TYPE:用于描述参数
● ElementType.TYPE : 用于描述类、接口(包括注解类型) 或enum声明。

@Constraint:(validatedBy = IdentityConstraintValidator.class)指定了我们的具体实现类如下

package com.zhaoxingban.www.common.validate.validator;

import com.zhaoxingban.www.common.validate.annotation.IdentityNo;
import org.springframework.util.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;

public class IdentityConstraintValidator implements ConstraintValidator<IdentityNo, String> {
    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        return check(s);
    }

    private static final String REGEX_ID_CARD18 = "^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9Xx])$";

    private boolean check(String idno){

        return StringUtils.hasText(idno) ? Pattern.matches(REGEX_ID_CARD18,idno) : true;
    }
}

一个自定义的注解大概就是这么个步骤实现,这里我们的身份证校验注解即完成了!

喜欢,请关注公众号《coder练习生》