由于业务关系,新的项目对于字段校验及数据唯一性校验较为严格,因此引用了hibernate-validator包进行校验,由于业务不得不进行自定义校验规则,这时候涉及到自定义注释进行校验接收的对象。对于java注解没有过多深入细节了解,一直处于用时方去找的状况。这次做一下笔记加深一下自己的印象,也希望有人看到给出更多建议,一切为了想进步。
Java 1.5 引入了注解,现在它在 Hibernate、Spring等 Java EE 框架中得到了大量使用。Java Annotation 是关于嵌入在程序本身中的程序的元数据。可以通过注解解析工具解析,也可以通过编译器解析。我们还可以将注释可用性指定为仅编译时或直到运行时。在 Java 注释之前,程序元数据可通过 Java 注释或 Javadoc 获得,但注释提供的远不止这些。注释元数据也可以在运行时使用,注释解析器可以使用它来确定流程。
Java自定义注解:
验证java注解的一些要点是:
- 注解方法不能有参数。
- 注释方法返回类型仅限于原始类型、字符串、枚举、注释或这些类型的数组。
- Java Annotation 方法可以有默认值。
- 注释可以附有元注释。元注释用于提供有关注释的信息。
@Documented @Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE, TYPE_USE}) @Inherited @Retention(RetentionPolicy.RUNTIME) public @interface MethodInfo { String message() default "该对象要求唯一"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
Java中的元注解:
- @Documented - 指示使用此注释的元素应由 javadoc 和类似工具记录。此类型应用于注释类型声明,这些类型的注释会影响其客户端对带注释元素的使用。如果使用 Documented 对类型声明进行注释,则其注释将成为带注释元素的公共 API 的一部分。
- @Target - 指示注释类型适用的程序元素的种类。一些可能的值是类型、方法、构造函数、字段等。如果目标元注释不存在,则可以在任何程序元素上使用注释。
- @Inherited – 表示自动继承注解类型。如果用户在类声明上查询注解类型,并且类声明没有针对该类型的注解,则将自动查询该类的超类以获取注解类型。将重复此过程,直到找到此类型的注释,或到达类层次结构(对象)的顶部。
- @Retention - 指示带有注释类型的注释将保留多长时间。它采用 RetentionPolicy 参数,其可能的值为 SOURCE、CLASS 和 RUNTIME
- @Repeatable - 用于指示其注释的注释类型是可重复的(了解即可)。
Java 中的内置注解:
@Override
– 当我们想要覆盖 Superclass 的一个方法时,我们应该使用这个注解来通知编译器我们正在覆盖一个方法。因此,当移除或更改超类方法时,编译器将显示错误消息。了解为什么我们应该在覆盖方法时始终使用java覆盖注释。@Deprecated
– 当我们希望编译器知道某个方法已被弃用时,我们应该使用这个注解。Java 建议在 javadoc 中,我们应该提供有关为什么不推荐使用此方法以及可以使用的替代方法的信息。@SuppressWarnings
– 这只是告诉编译器忽略它们产生的特定警告,例如在java genercis 中使用原始类型。它的保留策略是 SOURCE,它会被编译器丢弃。@FunctionalInterface
– 这个注解是在Java8中引入的,以表明该接口旨在成为一个功能接口。@SafeVarargs
– 程序员断言带注释的方法或构造函数的主体不会对其 varargs 参数执行潜在的不安全操作。
举例:
@Documented @Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE, TYPE_USE}) @Inherited @Retention(RetentionPolicy.RUNTIME) public @interface MethodInfo { String message() default "该对象要求唯一"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } interface UniqueTest{ } class Test{ public static void main(String[] args) { } @Override @MethodInfo(message = "fail",groups = UniqueTest.class) public String toString(){ return "Override toString method"; } @Deprecated @MethodInfo(message = "fail",groups = UniqueTest.class) public static void oldMethod(){ System.out.println("oldMethod"); } @SuppressWarnings({ "unchecked", "deprecation" }) @MethodInfo(message = "fail",groups = UniqueTest.class) public static void genericsTest() throws FileNotFoundException { List l = new ArrayList(); l.add("abc"); oldMethod(); } }
有太多的hibernate校验自定义注解,这里就不具体实现了,这里举例一个实现自定义注解做操作日志处理的方法:
@Inherited @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD }) public @interface AddOperationLog { }
@Aspect
@Component
class AddOperationLogAspect {
@Pointcut(value = "@annotation(xxx.xxx.xxx.AddOperationLog)")
public void controllerAspect() {
}
@After("controllerAspect()")
public void doBefore() {}
}
到此只是花时间简单梳理验证一下,后续有更深入了解,继续补充更新