刚从Java的脚本开发进入Spring开发,对于Spring中大量使用的注解之前认识较少,实在忍受不了后决定花一些时间对这方面的知识做一个总结。不对的地方请批评指正。
1、什么是注解(Annotation)
注解的本质是继承了Java Annotation接口和一系列元注解接口的子接口。其中Annotation接口是核心的接口,Java的元注解有六种,分别是:
@Retention: 描述注解的保存方式,有三种形式:保存在代码中,保存在class文件中,运行时保存并通过反射访问。自变量为RetentionPolicy
@Target: 描述注解面向哪一些Java对象,自变量为ElementType
@Documented: 标注这个注解是否包含在JavaDoc中
@Inherited: 标注这个注解继承于哪个注解类
@Repeatable: 标注这个注解可以重复标记
@Native: 仅能标注Field(变量),表示这个变量可以被本地代码引用
以上接口都定义在Java.lang.annotation包中:
2、注解的架构
一个注解由一个RetentionPolicy和N个ElementType定义,这两个类都属于枚举类,分别由上面提到的@Retention和@Target元注解来引入。
RetentionPolicy枚举类有CLASS、RUNTIME、SOURCE三个枚举常量,具体定义如下:
- CLASS:注释将被编译器在.class文件中引入,但是在VM虚拟机中运行时不需要保留;
- RUNTIME:注释将被编译器在.class文件中引入,也会在VM虚拟机中运行;
- SOURCE:注释只在源码中被保留,会被编译器忽略,要注意的是注解在编译器处理阶段还是存在的。
ElementType枚举类有12个枚举常量,定义如下:
注解的用处
注解可以通过反射机制获取注解内容后,将某些特性嵌入被注解对象的代码甚至字节码中(嵌入到什么层级由Retention元注解定义),可以方便编码者将一些公共特性抽象出来以后复用给相关对象。