注解
作用
- 用来检查某些限定,比如 override
- 打上标记,配合反射机制,获取注解上设定的某些值,用来做某些指定的事情
ElementType 与 RetentionPolicy
ElementType: 指定了一个annotation可以用来修饰哪种类型的类。
RetentionPolicy : 指明该annotation能够最多能够存在于哪个阶段,比如只能存在于 源码中,字节码中就已经不在了。
package java.lang.annotation;
public enum ElementType {
TYPE, /* 类、接口(包括注释类型)或枚举声明 */
FIELD, /* 字段声明(包括枚举常量) */
METHOD, /* 方法声明 */
PARAMETER, /* 参数声明 */
CONSTRUCTOR, /* 构造方法声明 */
LOCAL_VARIABLE, /* 局部变量声明 */
ANNOTATION_TYPE, /* 注释类型声明 */
PACKAGE /* 包声明 */
}
package java.lang.annotation;
public enum RetentionPolicy {
SOURCE, /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了 */
CLASS, /* 编译器将Annotation存储于类对应的.class文件中。默认行为 */
RUNTIME /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}
元注解
- @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。***(与 RetentionPolicy有关)***
- @Documented - 标记这些注解是否包含在用户文档中。
- @Target - 标记这个注解应该是哪种 Java 成员。***(与 ElementType 有关)***
- @Inherited - 标记的注解Annotation在使用在一个Base类上面后,该Base类的子类Sub类也同时具有该Annotation。
示例
在Spring中的应用
以 SpringMVC 的框架为例,其中分为三层,Controller、Service、Dao层。
@Service(“ClassName”),该注解打在Service层的类上,并且“ClassName”为该类的全限定名,首字母小写。
@Resource(name="…") 或者 @Autowired 两个注解用在Controller 层的 service成员变量上,那么spring就可以给该成员变量对象注入一个实例。
在 Spring 框架启动后,能够根据Service类的class创建一个实例对象,在对Controller类的class进行分析后,能够提取到其中成员变量的的注解信息,根据注解信息就可以与创建的实例对象关联起来了,那么就可以 类对象的自动创建与注入。