Spring注解原理探索(二)
之 Java中如何自定义注解
1.先看注解定义示例
@Override 源码定义:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
使用@interface 表示这是一个注解类。自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。
标注 @Target 元注解,声明@Override 的作用地方为METHOD。
标注 @Retention 元注解,指明@Override 被保留的级别-源码级别,编译的时候就被忽略。
** 引申1:注解定义格式:public @interface 注解名 {定义体} **
** 引申2:定义注解时,不得继承其他的注解或者接口。 **
SpringMVC 的 @RequestMapping 源码示例:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME) // 注解一直保持到VM运行期,被反射读取。
@Documented
@Mapping // SpringMVC定义的元注解,暂忽略此。
public @interface RequestMapping {
String name() default "";
@AliasFor("path") // SpringMVC中定义的别名注解。
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
用法示例:
@RequestMapping(value="/user", methods=RequestMethod.GET),
@RequestMapping可供选择的参数有:
name, value, path, method, params, headers, consumes, produces。
- 注解的每个参数对应着 @RequestMapping 类中的方法名。
- 每个参数指定一个默认值(default)。
** 引申3:注解类体中,每一个方法实际上声明了一个注解参数。方法名就是参数名,返回值类型就是参数类型。 **
** 引申4:注解参数支持的类型:8种基本类型(byte,short,int,long,float,double,char,boolean),String类型,Class类型,enum类型,Annotation类型,以上所有类型的数组。 **
** 引申5:访问修饰权限:public或者默认default。 **
** 引申6:注解元素必须要有默认值。在定义注解的默认值中指定,或者在使用注解的时候指定。非基本类型不能默认null。 **
当自定义注解类之后,便可以在类(ElementType.TYPE)、方法(ElementType.METHOD)上标注 @RequestMapping。
那怎样做才能让注解被Java程序所运行?
请参考:Spring注解原理探索(三)之 Java如何识别注解
[未完]